的SQL Server 2016的输出逗号分隔的表名的列表
问题描述:
我有下面的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'
答
你需要使用动态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,...')
这工作,因为我需要它。
此外,你必须从columnNames删除额外的昏迷。 –