如何在动态sql中为varchar类型使用IN中的子查询

时间:2011-04-08 16:01:30

标签: sql sql-server-2005

显然我不能做到以下几点:

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。当子查询跟随=,!=,<,< =,>,> =或子查询用作以下时,不允许这样做一个表达式。“这是有意义的,因为它被用作这个中的表达式。任何想法我如何实现这件作品。谢谢你们。

2 个答案:

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