【发布时间】:2014-08-22 09:41:57
【问题描述】:
我有一个动态 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)) + ''')';
但是,当我的 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.
【问题讨论】:
-
您的子查询必须返回一个字符串,或者可以隐式转换为字符串的内容,例如单列单行行集。在多个值的情况下,它们必须连接在一起并用逗号分隔才能成为单个字符串!当您的子查询返回诸如
1,2,15,27之类的结果时,您就可以将其添加到动态 SQL 字符串中了。 -
谢谢 - 我不太确定如何将 XML 输入转换为字符串。我一直都是这样做的,但在这个动态查询的情况下它似乎不起作用
标签: sql sql-server tsql stored-procedures