我希望这样做:
declare @FrameNumber nvarchar(20)
set @FrameNumber = '(p1, p2)'
select from myTable where c1 in @FrameNumber这方面的正确语法是什么?
(注意:我需要将@FrameNumber的值作为参数传递给存储过程...所以我至少要使用字符串"p1,p2")
我更倾向于并回答说它与SQL7兼容,但SQL2005就足够了。
发布于 2009-12-23 02:45:49
DECLARE @FrameNumbers TABLE (code NVARCHAR(20) PRIMARY KEY)
INSERT
INTO @framenumbers
VALUES ('p1')
INSERT
INTO @framenumbers
VALUES ('p2')
SELECT *
FROM mytable
WHERE c1 IN
(
SELECT code
FROM @framenumbers
)发布于 2009-12-23 02:49:41
CREATE FUNCTION [dbo].[func_ParseStringToTable] (@stringIN varchar(2000))
RETURNS @tOUT TABLE(RoomID int) AS
BEGIN
DECLARE @pos int
SET @pos=CHARINDEX(',',@StringIN)
WHILE @pos>0
BEGIN
INSERT @tOUT(RoomID) SELECT LEFT(@StringIN,CHARINDEX(',',@StringIN)-1)
SET @stringIN = SUBSTRING(@StringIN,CHARINDEX(',',@StringIN)+1,LEN(@StringIN))
SET @pos=CHARINDEX(',',@StringIN)
END
IF LEN(@StringIN)>0
BEGIN
INSERT @tOUT(RoomID) SELECT @StringIN
END
RETURN
END用法...
SELECT * FROM table WHERE id IN (func_ParseStringToTable(@ids))发布于 2009-12-23 02:58:09
您可以将这些值加载到表变量中,也可以使用动态sql。以下是每种方法的示例:
表变量
DECLARE @FrameNumbers TABLE (
Frame NVARCHAR(20)
)
INSERT INTO @FrameNumbers (
Frame
)
SELECT 'p1'
UNION ALL SELECT 'p2'选项1:
SELECT * FROM myTable WHERE c1 in (
SELECT Frame
FROM @FrameNumbers
)选项2:
SELECT
m.*
FROM myTable m
INNER JOIN @FrameNumbers f ON f.Frame = m.c1所有这些都很好,但这是我最喜欢的:
动态SQL
DECLARE
@FrameNumber nvarchar(20),
@sql nvarchar(max),
@ParamDef nvarchar(1000)
SET @FrameNumber = '(p1, p2)'
SET @sql = N'SELECT FROM myTable WHERE c1 IN ' + @FrameNumber
EXECUTE dbo.sp_ExecuteSQL @sqlhttps://stackoverflow.com/questions/1948351
复制相似问题