SQL Server不允许将子查询作为dynamicSQL执行

我试图做一个dynamic的SQL,为一些用户获取所有的任务

过程[GetAllSubExecutorsByUserId]返回所有的curent用户的子集的ID我写这些ID到一个临时表,然后我想做一个dynamicSQL从[任务]表中的所有任务,其中“Executor”列的值为IN这个临时表

我写的查询如下:

DECLARE @UserId VARCHAR(10) = 72; DECLARE @tmp TABLE ( Id VARCHAR(10)); INSERT @tmp exec [dbo].[GetAllSubExecutorsByUserId] @Source = @UserId; DECLARE @SQL VARCHAR(max); SELECT @SQL = 'SELECT * FROM tasks '; SELECT @SQL = @SQL + 'WHERE Executor IN (' + (select Id from @tmp) + ')'; EXEC(@SQL); 

但是当我运行它,它会给出一个错误:

子查询返回了多个值。 当子查询遵循=,!=,<,<=,>,> =或子查询用作expression式时,这是不允许的。

我不明白如何解决这个问题,因为如果我运行相同的查询(这不是一个dynamic的SQL它完美的作品)

工作的查询是静态的:

 DECLARE @UserId VARCHAR(10) = 72; DECLARE @tmp TABLE ( Id VARCHAR(10)); INSERT @tmp exec [dbo].[GetAllSubExecutorsByUserId] @Source = @UserId; SELECT * FROM tasks WHERE Executor IN (select Id from @tmp) 

但我需要一个dynamic的SQL …请帮我解决这个问题。

谢谢。

在这种情况下, select Id from @tmp的内部查询select Id from @tmp将不会为您build立一个ID的dynamic列表。 你正在使用不同的范围。 您需要为您构buildID列表的内容,然后将列表与其他dynamicSQL创build连接起来。

它在你的静态情况下工作,因为内部查询和你其余的SQL在同一个范围内。

您可以通过将@tmp更改为临时表而不是表variables来解决此问题,并删除并置。

 DECLARE @UserId VARCHAR(10) = 72; CREATE TABLE #tmp ( Id VARCHAR(10)); INSERT #tmp exec [dbo].[GetAllSubExecutorsByUserId] @Source = @UserId; DECLARE @SQL VARCHAR(max); SELECT @SQL = 'SELECT * FROM tasks '; SELECT @SQL = @SQL + 'WHERE Executor IN (select Id from #tmp)'; EXEC(@SQL); DROP TABLE #tmp 

这将移动临时表的范围,并允许您生成单个SQL语句来执行查询,而不pipe表中有多less条logging。

您也可以通过这样做来摆脱dynamicSQL。

 DECLARE @UserId VARCHAR(10) = 72; CREATE TABLE #tmp ( Id VARCHAR(10)); INSERT #tmp exec [dbo].[GetAllSubExecutorsByUserId] @Source = @UserId; SELECT * FROM tasks WHERE Executor IN (select Id from #tmp) DROP TABLE #tmp