我有一个包含大量字段的表,并且该表由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;
这在语法上是正确的,但依赖于匹配字段的顺序,这更容易出错,那么该怎么办?我是否忽略了一个更为明显的第三种选择?
澄清:目的是让从长远来看更容易维护代码。我们将多次更新此声明,因此我正在寻找一种方法,使其更易读,更容易修改。
答案 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;
它破坏了大多数代码格式化指南,但至少可以告诉如何完成映射而无需计算两个地方的字段。