2017-10-17 41 views
0

我有下面的T-SQL查询(这将是一个存储过程中):的SQL Server 2016的输出逗号分隔的表名的列表

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表列名称,而无需编辑存储过程。

因此,采取上面的例子中列名,这就是我想要做的事:

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'

回答

0

你需要使用动态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,但有多个列。您需要调整这些值才是正确的。

+0

此外,你必须从columnNames删除额外的昏迷。 –

0

您需要实现类似下面的动态查询:

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

我还发现了一个工作方法:

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

这工作,因为我需要它。