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,...')
这是我需要的。
我有以下 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,...')
这是我需要的。