我有以下Sql查询的存储过程。
SELECT @WorkGrpIDforUser = STUFF((SELECT ',' + convert (nvarchar(20),Work_grp_id )
FROM WORK_GRP_USER
where emp_id in(@WorkTypeIdentity)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
我从我的应用程序传递(@WorkTypeIdentity)值为'ABC','HI'。此查询不返回任何结果。但是,如果我在此查询中输入值'ABC','HI',它就会给出结果。
我没有得到我所缺少的东西。任何人都可以建议。
答案 0 :(得分:1)
问题与STUFF
无关。您无法以这种方式参数化IN
子句。你最终运行的是:
emp_id in(''ABC', 'HI'')
即。你仍然只是检查emp_id
一个值。您有许多选项,第一个(也可以是首选)是使用table-valued parameters。
这样做的第一步是创建你的类型:
CREATE TYPE dbo.ListOfString AS TABLE (Value VARCHAR(MAX));
然后您可以将此类型作为参数传递:
DECLARE @Values dbo.ListOfString;
INSERT @Values VALUES ('HI'), ('ABC');
...
WHERE emp_id IN (SELECT Value FROM @Values)
或转到您的程序:
CREATE PROCEDURE dbo.SomeProcedure @Strings dbo.ListOfString READONLY
AS
BEGIN
....
END
下一个选项是使用LIKE
:
WHERE ',' + @WorkTypeIdentity + ',' LIKE '%,' + emp_id + ',%';
最后,您可以使用其他一些字符串拆分方法在比较之前拆分参数。如需进一步阅读,我建议您阅读:
要总结这些文章,要么使用CLR字符串拆分函数,要么使用表值参数,如果您创建字符串拆分函数,您的SQL将类似于:
WHERE emp_id IN (SELECT Value FROM dbo.Split(@WorkTypeIdentity))