【问题标题】:Create list of column names for insert into table创建用于插入表的列名列表
【发布时间】:2016-09-09 14:50:24
【问题描述】:

我正在处理一个查询,我需要将行插入到具有相同列名的表和临时表中。

我想避免在每个插入语句中重复列名,并希望创建一个列表并将列表传递给插入语句。

这是我目前所拥有的:

DECLARE @columnNameList varchar(MAX) = COALESCE(RecType, ColumnName, 
    SourcePosition, MaxWidth, isNullable, dotNetDataType, [Format])

EXEC('INSERT INTO #RowList (' + @columnNameList + ')
    VALUES......

几乎有效。每个列名都出现如下错误:

列名“RecType”无效

认为这个错误是因为列名在被转换为字符串时有单引号。

有没有办法构建列对象列表而不是要传入的字符串?

【问题讨论】:

  • 准备有最终查询的@sql 变量,在调试屏幕上打印并弄清楚发生了什么

标签: sql sql-server database tsql


【解决方案1】:

您可以使用STUFFXML PATH 以逗号分隔表格的所有列(此处为myTableName)创建一行

select STUFF((select ','+a.name
  from sys.all_columns a join sys.tables t 
    on a.object_id = t.object_id 
   and t.name = 'myTableName'
order by a.column_id
for xml path ('')
),1,1,'')

输出

column1,column2,...,columnN

【讨论】:

  • 谢谢,我将您的两个答案结合起来得到this
【解决方案2】:

在下面试试这个查询。

create table #rowlist (RecType int, ColumnName int, 
    SourcePosition int, MaxWidth int, isNullable int, dotNetDataType int, [Format] int)

DECLARE @columnNameList nvarchar(MAX) ='(RecType, ColumnName, 
    SourcePosition, MaxWidth, isNullable, dotNetDataType, [Format])'

DECLARE @SQLCMD nvarchar(MAX) =N'INSERT INTO #RowList ' + @columnNameList + N' VALUES (1,1,1,1,1,1,1)'

exec(@sqlcmd)

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2019-11-08
    相关资源
    最近更新 更多