我有一个包含大量字段的表,该表由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;
哪一个语法正确,但依赖于匹配字段的顺序,这更容易出错,那么该怎么办呢?我是不是忽略了更明显的第三种选择?
澄清:目的是使代码更容易长期维护。我们将多次更新此语句,因此我正在寻找一种使其更可读、更易于修改的方法。
您可以编写一个查询,使用动态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)
要加快上述速度,可以做的一件事是将SSMS中的Columns
值拖动到一个新查询中,编辑器将在一行中显示所有列名。
所以
INSERT INTO MyTable
SELECT
拖动列
FROM SomeView;
您的列将显示为逗号分隔的列表,如果需要,有些列可能会缺少[],但这比键入它们更快。
我想出了一个技术含量很低的解决方案:
INSERT INTO MyTable (column1, colunm2, colunm3, ..., column200)
SELECT column1, column2, column3, ..., column200
FROM SomeView;
它打破了大多数代码格式准则,但至少可以在不必计算两个位置的字段的情况下判断映射是如何完成的。