2017-10-17 45 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,...') 

這工作,因爲我需要它。