sql-server - 在动态 sql 脚本中使用变量
问题描述
我目前正在编辑一个过程,我们称之为它A
,它对在过程中创建的临时表进行一些操作B
(因此过程 B 调用 A)。过程 B 包含一个参数,即所述临时表的名称。
话虽如此,我们需要将临时表的所有列(在 CSV 中)检索到一个变量中。由于名称每次都不一样,我需要使用动态SQL。
这是我所拥有的:
-- Input parameters: @sTempTableName VARCHAR(MAX) --> Name of the temporary table to alter
DECLARE
@sColumns AS NVARCHAR(MAX) = '',
@sAlterTableDynamicSQL AS VARCHAR(MAX)
SET @sAlterTableDynamicSQL =
'
SELECT @sColumns = @sColumns + [name] + N'','' FROM Tempdb.Sys.Columns WHERE [object_id] = object_id(''tempdb..' + @sTempTableName + ''')
'
PRINT (@sAlterTableDynamicSQL)
EXEC (@sAlterTableDynamicSQL)
这没有说我需要声明,@sColumns
因为它不存在(我猜变量在连接之间不共享)。我怎样才能做到这一点?我想我可以创建另一个临时表来保存该 CSV,但我认为应该有另一种方法。
解决方案
您应该使用 sp_executesql 语句。它看起来像这样:
DECLARE
@sColumns NVARCHAR(MAX),
@sAlterTableDynamicSQL NVARCHAR(MAX),
@temptableid INT = 3;
SELECT @sAlterTableDynamicSQL =
N'SELECT @sColumns = STRING_AGG([name], '','') FROM Tempdb.Sys.Columns WHERE [object_id] = + CAST(@temptableid AS VARCHAR(10))';
EXEC sp_executesql @sAlterTableDynamicSQL, N'@sColumns NVARCHAR(MAX) OUTPUT, @temptableid INT', @sColumns = @sColumns OUTPUT, @temptableid = @temptableid
SELECT @sColumns;