3

我有一个包含大量字段的表,并且该表正在由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;

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

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

4

3 回答 3

2

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

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)
于 2013-08-27T08:29:55.157 回答
1

为了加快上述速度,您可以做的一件事是将ColumnsSSMS 中的值拖到新查询上,编辑器将在一行中显示所有列名。

所以

INSERT INTO MyTable
SELECT

拖动列

FROM SomeView;

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

于 2013-08-27T08:24:41.747 回答
-1

我想出了这个技术含量很低的解决方案:

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

它违反了大多数代码格式准则,但至少可以告诉映射是如何完成的,而不必计算两个地方的字段。

于 2013-08-27T09:14:28.513 回答