Вы можете взять вашу входную строку и вызвать табличную функцию, чтобы преобразовать ее в таблицу с одним столбцом, которую вы можете вложить в предложение 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