首页 > 解决方案 > 在动态 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,但我认为应该有另一种方法。

标签: sql-serverdynamic-sql

解决方案


您应该使用 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;

推荐阅读