使用INSERT INTO ... SELECT时避免重复字段名称

时间:2013-08-27 08:15:40

标签: sql sql-server

我有一个包含大量字段的表,并且该表由INSERT INTO ... SELECT查询填充。由于字段数量很大,我得到这样的结果:

INSERT INTO MyTable (
                column1,
                colunm2,
                colunm3,
                ...
                column200)
SELECT column1,
       column2,
       column3,
       ...
       column200
  FROM SomeView;

以上是繁琐且易于维护的问题,所以如果有可能有某种"天然插入"其中SELECT子句中的字段名称映射到目标表中具有相同名称的字段。

我试过了:

INSERT INTO MyTable
SELECT column1,
       column2,
       column3,
       ...
       column200
  FROM SomeView;

这在语法上是正确的,但依赖于匹配字段的顺序,这更容易出错,那么该怎么办?我是否忽略了一个更为明显的第三种选择?

澄清:目的是让从长远来看更容易维护代码。我们将多次更新此声明,因此我正在寻找一种方法,使其更易读,更容易修改。

3 个答案:

答案 0 :(得分:2)

您可以自己编写一个使用动态SQL生成insert语句(甚至同时执行它)的查询:

DECLARE @cols VARCHAR(MAX)
SELECT @cols = 
    STUFF( (SELECT ', ' + name 
            FROM sys.columns 
            WHERE object_id = object_id('MyTable') 
          FOR XML PATH('')),1,1,'')

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'INSERT INTO MyTable (' + @cols + ') 
               SELECT ' + @cols + ' FROM SomeView'

--print the statement and copy/paste it for saving or using
PRINT (@sql)

--or just execute it right here
EXEC (@sql)

答案 1 :(得分:1)

要加快上述速度,可以做的一件事就是将SSMS中的Columns值拖到新查询中,编辑器会在一行中显示所有列名。

所以

INSERT INTO MyTable
SELECT

拖动列

FROM SomeView;

您的列将显示为以逗号分隔的列表,如果需要,某些列可能会缺少[],但它比键入它们更快。

答案 2 :(得分:-1)

我提出了这个非常低技术的解决方案:

INSERT INTO MyTable (column1, colunm2, colunm3, ..., column200)
SELECT               column1, column2, column3, ..., column200
  FROM SomeView;

它破坏了大多数代码格式化指南,但至少可以告诉如何完成映射而无需计算两个地方的字段。