我发现有两种方法可以将许多行插入到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);
答案 0 :(得分:1)
要合并的数据来自哪里?
VALUES
子句。不要使用UNION ALL
,因为它更详细,不能很好地记录语义并增加查询编译时间,因为优化器必须将其转换为VALUES
形式。