TSQL动态查询

TSQL动态查询,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我有一个动态的TSQL查询,它在很大程度上起作用,但是我现在尝试在它中添加一个IN子句,因为我正在传递多个员工ID并希望获取他们的数据 这就是我要添加的内容的陈述: IF @awardEmployees IS NOT NULL SET @Where = @Where + ' AND A.[employee] IN 'SELECT ParamValues.x2.value('empID[1]', 'VARCHAR(60)') FROM @awardEmployees.nodes(

我有一个动态的TSQL查询,它在很大程度上起作用,但是我现在尝试在它中添加一个
IN
子句,因为我正在传递多个员工ID并希望获取他们的数据

这就是我要添加的内容的陈述:

IF @awardEmployees IS NOT NULL
        SET @Where = @Where + ' AND A.[employee] IN 'SELECT ParamValues.x2.value('empID[1]', 'VARCHAR(60)') FROM  @awardEmployees.nodes('/employees/employee') AS ParamValues(x2);
在这样的动态查询中可以有IN子句吗?我一直在尽我所能,但似乎没有任何效果。它当前所做的只是返回我正在搜索的
empID
,甚至没有正确运行查询

更新:

当我这样做时,它只为一名员工工作:

IF @awardEmployees IS NOT NULL
        SET @Where = @Where + ' AND A.[employee] IN (''' +(SELECT ParamValues.x2.value('empID[1]', 'VARCHAR(60)') FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x2)) + ''')';
但是,当my XML包含2个或更多雇员时,会抛出以下错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。

子查询中的
及其周围需要括号:

IF @awardEmployees IS NOT NULL
    SET @Where = @Where + ' AND A.[employee] IN (''' +
                 (SELECT ParamValues.x2.value('empID[1]', 'VARCHAR(60)') FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x2)
                 ) + ''');
这假设查询的结果是一行一列,该列具有逗号分隔的列表

编辑:

您可以尝试将它们连接在一起:

IF @awardEmployees IS NOT NULL
    SET @Where = @Where + ' AND A.[employee] IN (' +
                 stuff((SELECT ', ''' + ParamValues.x2.value('empID[1]', 'VARCHAR(60)') + ''''
                        FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x2)
                        FOR XML PATH ('')
                       ), 1, 2, '') + ');

您需要将nodes()方法返回的表转换为逗号分隔的值列表

        IF @awardEmployees IS NOT NULL
             SET @Where = @Where + ' AND A.[employee] IN (' + stuff(
          (
            select ','+QUOTENAME(ParamValues.x2.value('@empID[1]', 'VARCHAR(60)'), '''')
            FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x2)
            for xml path(''),type
          ).value('.','varchar(max)'),1,1,'') + ')'

下面就说明了这个想法。顺便说一句,当您这样做时,您将不需要sp_executesql调用中的
@\u awardEmployees=@awardEmployees
的参数,我尝试了类似的方法,但在运行它时出错
SQL Server]无效的列名“ABC123”
<这是我正在搜索的员工ID。我完全试过了,结果还是一样error@SBB . . . 在这种情况下,正如我刚才添加的那样,您需要更多的单引号。您应该编辑您的问题,并显示变量替换后
@where
变量的内容。@GordonLinoff:我认为您需要从
选择参数值.x2.value
中构造一个逗号分隔的列表。我认为您需要使用FOR XML路径或其他方法这就是我的整个SP的外观。我试图在执行之前找出如何显示where子句:您的子查询必须返回字符串,或者可以隐式转换为字符串的内容,例如单列单行行集。对于许多值,它们必须连接在一起并用逗号分隔,才能成为单个字符串!当您的子查询返回一个结果(如
1,2,15,27
)时,您可以将其添加到动态SQL字符串中。谢谢-我不太确定如何将XML输入转换为字符串。我一直都是这样做的,但在这个充满活力的问题上,它似乎不起作用。这很有效;谢谢。我遇到的一个问题是,当我没有要查找的员工时,试图将该值设置为null
SET@awardEmployees=null如果(@awardEmployees,”)
这不起作用,因为我得到错误
数据类型xml和varchar在equal to运算符中不兼容。
当传递的值为空时,有没有办法将其设置为null?只需删除这一行。if语句正在检查nullRight,但脚本无论如何都会传递某些内容,它要么是XML字符串,要么是空值。所以它总是不是空的,这就是为什么我有其他的行说如果它是空的