显然我不能做到以下几点:
DECLARE @sql VARCHAR(2000)
SET @sql = 'SELECT es.* FROM emp_schedule es
WHERE es.work_status IN (' + (SELECT data_value FROM #absences) + ')'
exec sp_executesql @sql
列data_value的类型为varchar,因此是es.work_status。此查询将给出错误“子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或子查询用作以下时,不允许这样做一个表达式。“这是有意义的,因为它被用作这个中的表达式。任何想法我如何实现这件作品。谢谢你们。
答案 0 :(得分:2)
为什么不使用join
?:
DECLARE @sql VARCHAR(2000)
SET @sql = 'SELECT es.*
FROM emp_schedule es
JOIN #absences a ON es.work_status = a.data_value'
exec sp_executesql @sql
怎么样:
SET @sql = 'SELECT es.* FROM emp_schedule es
WHERE es.work_status IN (SELECT data_value FROM #absences)'
即: 在(SELECT data_values...
内附加@sql
语句
答案 1 :(得分:2)
首先,您可以在没有连接的情况下执行此操作:
Set @Sql = 'Select es....
From emp_schedule As es
Where es.work_status In ( Select data_value
From #absenses )'
但是,如果你必须A:用动态SQL和B执行此操作:在可以静态构建SQL语句而不是直接从临时表中查询的情况下,您可以这样做:
Declare @InParameters nvarchar(max)
Set @InParameters = Stuff(
(
Select ',' + QuoteName(data_value,'''')
From #absenses
For Xml Path('')
), 1, 1, '')
Select @Sql = 'Select es...
From emp_schedule As es
Where es.work_status In (' + @InParameters + ')'