2009-02-10 60 views

回答

3

我不相信「IN '子句可以處理一個表達式,我相信你需要一個文字。

嘗試:

declare @sql NVARCHAR(MAX) 

declare @SPType NVARCHAR (30) 
declare @SPCodeA int 

set @SPCodeA = 75 
set @SPType = '''I'',''M''' 
SET @sql = 'select * from table where CodeA=' + CONVERT(NVARCHAR(MAX), @spcodea) +' and Type in (' + @sptype + ')' 

EXEC (@sql) 
+0

我想這樣做這樣的,但不是使用EXEC我打算使用EXECUTE @ErrorCode = sp_executesql的@sql,這樣我可以得到一個錯誤響應知道如果我需要回滾代碼我」正在執行。 – 2009-02-10 18:34:50

2

我已經在過去遇到這個問題也發現了一些意見在網絡上解決這個問題。我找到的解決方案是解析輸入字符串中的各個值,將它們作爲行放入臨時表中,然後使用帶有IN子句的子查詢來獲取值。以下是我正在使用的代碼的簡化。它假定來自IN子句的值是smallint,使用varchar可能會相當容易改變。

有關進一步的參考,請參閱this文章用不同的方法來解決這個問題。

 

DECLARE @TempList table 
(
    Enum smallint 
) 

DECLARE @Enum varchar(10), @Pos int 

SET @ValueList = LTRIM(RTRIM(@ValueList))+ ',' 
SET @Pos = CHARINDEX(',', @ValueList, 1) 

IF REPLACE(@ValueList, ',', '') '' 
BEGIN 
    WHILE @Pos > 0 
    BEGIN 
     SET @Enum = LTRIM(RTRIM(LEFT(@ValueList, @Pos - 1))) 
     IF @Enum '' 
     BEGIN 
      INSERT INTO @TempList (Enum) VALUES (CAST(@Enum AS smallint)) --Use Appropriate conversion 
     END 
     SET @ValueList = RIGHT(@ValueList, LEN(@ValueList) - @Pos) 
     SET @Pos = CHARINDEX(',', @ValueList, 1) 
    END 
END 

SELECT * 
FROM ExampleTable 
WHERE 
ExampleTable.Enum in (select Enum from @TempList)