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

如何在varchar类型的动态sql中使用子查询,sql,sql-server-2005,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 列数据_值的类型为varchar,es.work_状态的类型为varchar。此查询将给我错误子查询返回的值超过1。当子查

显然,我无法做到以下几点:

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
列数据_值的类型为varchar,es.work_状态的类型为varchar。此查询将给我错误子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。这是有意义的,因为它在这一节中被用作表达式。有什么想法我可以实现这一块。谢谢各位。

为什么不使用加入

编辑: 那么这个呢:

SET @sql = 'SELECT es.* FROM emp_schedule es
             WHERE  es.work_status IN (SELECT data_value FROM #absences)'
i、 e:附加所选数据值。。。@sql中的语句为什么不使用联接

编辑: 那么这个呢:

SET @sql = 'SELECT es.* FROM emp_schedule es
             WHERE  es.work_status IN (SELECT data_value FROM #absences)'

i、 e:附加所选数据值。。。@sql中的语句首先,您可以在不连接的情况下执行此操作:

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

首先,您可以在不连接的情况下执行此操作:

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


这不是目的。我以这个查询为例,我需要在一个大型存储过程中使用它,在这个过程中,我无法将逻辑从in更改为join。+1这也是我的第一个建议-为什么要让生活变得更艰难?所以问题是,如何做一个像MySql这样的组?看这里:伙计们,这个条件是在一个很深的where子句中加上很多其他的情况和条件的。如果不重新写入整个存储过程,我无法使用连接条件。此外,我也想知道这一点,以备将来参考。我只是不想写一个函数,将子查询中的数据分割成逗号分隔的字符串。谢谢。@user503510,那你想要什么?这不是目的。我以这个查询为例,我需要在一个大型存储过程中使用它,在这个过程中,我无法将逻辑从in更改为join。+1这也是我的第一个建议-为什么要让生活变得更艰难?所以问题是,如何做一个像MySql这样的组?看这里:伙计们,这个条件是在一个很深的where子句中加上很多其他的情况和条件的。如果不重新写入整个存储过程,我无法使用连接条件。此外,我也想知道这一点,以备将来参考。我只是不想写一个函数,将子查询中的数据分割成逗号分隔的字符串。谢谢。@user503510,那么您想要什么?为什么这需要是动态的?select需要是逗号分隔的列表吗?或者它应该只返回1个值?为什么这需要是动态的?select是否需要是逗号分隔的列表?还是应该只返回1个值?天哪!是的,我可以直接在字符串中嵌入整个子查询,因为临时表已经在数据库中可用。谢谢你,托马斯…在另一个节点上,使用第二种方法,问题是,我将得到一个字符串,如“VAC,JURY\u DUTY”,我应该得到的是“VAC”,“JURY\u DUTY”,因为工作状态是varchar类型。。。关于这个有什么建议吗?谢谢。关于这一点,您需要在@InParameters后面加上“作为varchar的初始引号”。请添加SET@InParameters=+@InParameters;然后我会把你的答案标记为答案。再次感谢托马斯-真的吗?在我的测试中,@InParameters生成的值都正确地用单引号括起来,包括第一个值。也就是说,您不需要为@InParameters预先加上另一个单引号。如果缺勤在数据中只有两个值,则值为:VAC和BRT。在打印@InParameters时,我得到了VAC',BRT。。。我不知道你为什么要把它包好…哦,我的天啊!是的,我可以直接在字符串中嵌入整个子查询,因为临时表已经在数据库中可用。谢谢你,托马斯…在另一个节点上,使用第二种方法,问题是,我将得到一个字符串,如“VAC,JURY\u DUTY”,我应该得到的是“VAC”,“JURY\u DUTY”,因为工作状态是varchar类型。。。关于这个有什么建议吗?谢谢。关于这一点,您需要在@InParameters后面加上“作为varchar的初始引号”。请添加SET@InParameters=+@InParameters;然后我会把你的答案标记为答案。再次感谢托马斯-真的吗?在我的测试中,@InParameters生成的值都正确地用单引号括起来,包括第一个值。也就是说,您不需要为@InParameters预先加上另一个单引号。如果缺勤在数据中只有两个值,则值为:VAC和BRT。在打印@InParameters时,我得到了VAC',BRT。。。我不知道你为什么要把它包好。。。