您可以使用輸入字符串並調用一個表值函數,將其轉換爲可以嵌套到IN子句中的單個列表。比使用動態sql更好。
CREATE FUNCTION [dbo].[ConvertCSVToTable] (@StringInput VARCHAR(8000))
RETURNS @OutputTable TABLE (Id int)
AS
BEGIN
DECLARE @String VARCHAR(10)
WHILE LEN(@StringInput) > 0
BEGIN
SET @String = LEFT(@StringInput,
ISNULL(NULLIF(CHARINDEX(',', @StringInput) - 1, -1),
LEN(@StringInput)))
SET @StringInput = SUBSTRING(@StringInput,
ISNULL(NULLIF(CHARINDEX(',', @StringInput), 0),
LEN(@StringInput)) + 1, LEN(@StringInput))
INSERT INTO @OutputTable (Id)
VALUES (@String)
END
RETURN
END
這將允許你仍然參數列表輸入並避免動態sql,結果會是這個樣子......
SELECT @nDBNum = Num FROM Num_membersGROUP BY Num
HAVING SUM(CASE WHEN Part_No IN (
SELECT Id from dbo.ConvertCSVToTable(@strOrderedString)
)
THEN 1 ELSE 0 END) = @nCount
AND COUNT(*) = @nCount
爲什麼它不使用內部子查詢? –