使用Merge同时插入多行的最有效语法是什么?

时间:2013-01-22 19:33:11

标签: sql-server sql-server-2008

我发现有两种方法可以将许多行插入到SQL Server 2008的表中。

其中一个在http://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx找到创建临时表,然后将值插入临时表,最后将该表与目标能够合并。

这对我来说似乎不是很有效,因为你必须创建一个表,填充表,合并到目标表,然后删除临时表。

我能想到的另一件事情如下......

MERGE dbo.targettable as tgt
USING (
SELECT 12 as col1, 13 as col2, 'abc' as col3, 'zyx' as col4
UNION ALL
SELECT 11 as col1, 11 as col2, 'def' as col3, 'def' as col4
(etc etc)
UNION ALL
SELECT 7 as col1, 10 as col2, 'jfj' as col3, 'tub' as col4)
as new
ON tgt.col1=new.col1
WHEN MATCHED THEN UPDATE SET tgt.col2=new.col2, tgt.col3=new.col3, tgt.col4=new.col4
WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4)
VALUES(new.col1, new.col2, new.col3, new.col4);

根据usr的回答,我找到了http://msdn.microsoft.com/en-us/library/bb510625.aspx

我认为这是做到这一点的方法。有人可以验证这种语法是否正确?

MERGE dbo.targettable as tgt
USING (VALUES(12, 13, 'abc', 'zyx'), (11, 11, 'def', 'def'),(7, 10, 'jfj', 'tub'))
AS new (col1, col2, col3, col4)
ON tgt.col1=new.col1
WHEN MATCHED THEN UPDATE SET tgt.col2=new.col2, tgt.col3=new.col3, tgt.col4=new.col4
WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4)
VALUES(new.col1, new.col2, new.col3, new.col4);

1 个答案:

答案 0 :(得分:1)

要合并的数据来自哪里?

  • 如果它来自查询,请将查询内联到合并中。
  • 如果是的话 来自应用程序,使用表值参数。
  • 如果生成了 迭代地,使用临时表或表变量。
  • 如果它是一个常量,请使用VALUES子句。不要使用UNION ALL,因为它更详细,不能很好地记录语义并增加查询编译时间,因为优化器必须将其转换为VALUES形式。