SQL Server 2016 输出 table 名称的逗号分隔列表

SQL Server 2016 output comma seperated list of table names

我有以下 T-SQL 查询(将在存储过程中):

DECLARE @columnNames nvarchar(MAX);

SELECT 
    @columnNames = COALESCE(@columnNames + ',','') + sC.name 
FROM 
    sys.columns sC
JOIN 
    sys.tables AS sT ON sT.object_id = sC.object_id
WHERE 
    sC.name NOT IN (SELECT name 
                    FROM sys.identity_columns 
                    WHERE is_identity = 1)
    AND sT.name = 'Audit' 
ORDER BY 
    sC.column_id 

INSERT INTO [B2017].[dbo].[Audit] (@columnNames) 
VALUES ('')

如果我运行只是这样:

DECLARE @columnNames nvarchar(MAX);

SELECT 
    @columnNames = COALESCE(@columnNames + ',','') + sC.name 
FROM 
    sys.columns sC
JOIN 
    sys.tables AS sT
ON 
    sT.object_id = sC.object_id
WHERE 
    sC.name NOT IN (SELECT name FROM sys.identity_columns WHERE is_identity = 1)
AND 
    sT.name = 'Audit' 
ORDER BY 
    sC.column_id 

它应该显示:

columnName1,columnName2,columnName3,etc...

但是,我想做的是将 (@columnNames) 输出到 INSERT INTO 中,这样我就可以随时动态更改 Audit table 列名,而无需需要编辑存储过程。

所以采用上面的示例列名称,这就是我想要做的:

INSERT INTO [B2017].[dbo].[Audit] (columnName1, columnName2, columnName3,etc...) 
VALUES ('somevalue1,somevalue2,somevalue3,...')

尝试上面的完整代码(包括 INSERT INTO)时出现此错误:

Msg 207, Level 16, State 1, Line 51
Invalid column name '@columnNames'

您需要使用动态 SQL:

declare @sql nvarchar(max);

set @sql = '
INSERT INTO [B2017].[dbo].[Audit] ([columnNames]) 
    VALUES ('''')
';

set @sql = replace(@sql, '[columnNames]', '@columnNames')

exec sp_executesql @sql;

话虽如此,这段代码仍然行不通。您将一个值传递给 values,但有多个列。您需要调整这些值才能正确。

您需要像下面这样实现动态查询:

execute('INSERT INTO [B2017].[dbo].[Audit] (' + @columnNames + ') VALUES('''')')

我也找到了一个工作方法:

INSERT INTO 
    [B2017].[dbo].[Audit] OUTPUT (@columnNames)
VALUES 
    ('somevalue1,somevalue2,somevalue3,...')

这是我需要的。