Sql server 如何在while循环中使用动态表名和sp_executesql?

Sql server 如何在while循环中使用动态表名和sp_executesql?,sql-server,stored-procedures,dynamic,while-loop,Sql Server,Stored Procedures,Dynamic,While Loop,我在数据库中有许多固定的表名。我需要从所有这些表中收集相同类型的数据,并且我需要select语句便于多人调整和维护。最后一点,我们通常通过将这些代码部分放在运行它们的代码的“外部”来解决 为了完成所有这些,我首先尝试在具有表名的列表上进行循环。但据我所知,TSQL(或SQL)没有这种功能。因此,我声明了一个计数器,并使用该计数器用if语句定义我的表名。因为我还需要打印日志的表名,所以我没有成功地使用exec语句。所以,我试图通过在while循环中使用sp_executesql和动态表名来解决这个

我在数据库中有许多固定的表名。我需要从所有这些表中收集相同类型的数据,并且我需要select语句便于多人调整和维护。最后一点,我们通常通过将这些代码部分放在运行它们的代码的“外部”来解决

为了完成所有这些,我首先尝试在具有表名的列表上进行循环。但据我所知,TSQL(或SQL)没有这种功能。因此,我声明了一个计数器,并使用该计数器用if语句定义我的表名。因为我还需要打印日志的表名,所以我没有成功地使用exec语句。所以,我试图通过在while循环中使用sp_executesql和动态表名来解决这个问题。设置(简化)如下所示:

declare @r nvarchar(max), @p nvarchar(150), @t nvarchar(40), @i int, @t1 varchar(8), @t2 varchar(8), @t3 varchar(8)

set @r = N'print @tab select * from ' + @t + '
set @p = N'@tab nvarchar(40)'
set @i = 1
set @t1 = 'A'
set @t2 = 'B'
set @t3 = 'C'

while @i < 4
begin

if @i = 1 set @t = @t1
else if @i = 2 set @t = @t2
else if @i = 3 set @t = @t3

set @t = concat('tmp_',@t)

exec sp_executesql @r, @p, @tab = @t

set @i = @i + 1
end
我可以让它与EXEC命令一起工作,但这意味着我必须将set@r语句放在循环中,这使它对我来说不那么平滑,因为我想稍后在另一个循环中再次重用@r代码

在TSQL中有这样做的方法吗


(由于严格保密,我无法复制和粘贴我在此处运行的实际代码。脚本在没有select语句或exec语句但没有print语句的情况下按其外观运行。任何可能出现的语法拼写错误都是在我手动重写此处的通用代码时出现的。)

@t
没有任何值(它是
空的
),因此,
N'print@tab select*from'+@t+'.'.
具有值
NULL
,因此不会运行任何操作。另外,像
N'.+@t+N'.
这样的语法非常危险。始终使用
QUOTENAME
注入动态对象。最后,如果@i=1 set@t='A'.这样的语句位于动态对象中语句,但单引号(
)没有转义,因此上面的内容实际上会导致语法错误。另外,第2行还有一个额外的引号,
while/if
循环有点代码味道。您实际想做什么?感谢您的帮助。很抱歉给您带来不便,我的“捷径”使用变量名创建。我已经调整了代码,使其看起来更像while循环中it-and-set语句中的实际代码。我还添加了一个更清晰、更详细的解释,说明了我正在尝试做什么以及为什么要这么做。
set @r = N'print @tab'