1

SQL Server 2008 で多くの行をテーブルにアップサートする方法が 2 つあります。

そのうちの 1 つがここにあります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);
4

1 に答える 1

1

マージされるデータはどこから来ますか?

  • クエリからのものである場合は、クエリをマージにインライン化します。
  • アプリからのものである場合は、テーブル値パラメーターを使用します。
  • 繰り返し生成される場合は、一時テーブルまたはテーブル変数を使用します。
  • 例のように定数の場合は、VALUES句を使用します。オプティマイザーがそれをフォームUNION ALLに変換する必要があるため、より冗長で、セマンティクスを適切に文書化せず、クエリのコンパイル時間が長くなるため、使用しないでください。VALUES
于 2013-01-22T20:49:40.780 に答える