SQl Stuff没有返回结果

时间:2014-10-21 06:49:44

标签: sql-server-2008

我有以下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',它就会给出结果。

我没有得到我所缺少的东西。任何人都可以建议。

1 个答案:

答案 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))