Created
September 9, 2014 07:05
-
-
Save KentaYamada/4abda2017196417df8d2 to your computer and use it in GitHub Desktop.
テーブル型変数とMERGE文を使って複数データをUPSERTする
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 「複数データのUPSERT」 | |
* 作成者:Kenta Yamada | |
* 作成日:2014/09/09 | |
* DBMS:SQL-Server2008R2 | |
*/ | |
--データベース作成 | |
CREATE TABLE sqlPractice | |
--テーブル作成 | |
GO | |
USE sqlPractice | |
GO | |
CREATE TABLE products ( | |
id INT NOT NULL | |
,name VARCHAR(40) NOT NULL | |
,category_id CHAR(6) NOT NULL | |
,upd_id CHAR(6) NOT NULL | |
,upd_date DATETIME NOT NULL | |
,PRIMARY KEY(id) | |
) | |
--ユーザー定義テーブル型作成 | |
GO | |
CREATE TYPE Products AS TABLE ( | |
id INT | |
,name VARCHAR(40) | |
,category_id CHAR(6) | |
,upd_id CHAR(6) | |
) | |
--productsテーブルに1件データ挿入、確認 | |
GO | |
INSERT INTO products | |
VALUES (1, 'ham egg', '000001', 'test', GETDATE()) | |
SELECT * FROM products | |
--ストアドプロシージャ定義 | |
GO | |
CREATE PROCEDURE EntryProducts ( | |
@products Products readonly | |
) AS | |
BEGIN TRY | |
BEGIN TRAN | |
MERGE INTO products | |
USING (SELECT * FROM @products) t | |
ON products.id = t.id | |
WHEN MATCHES then | |
UPDATE SET | |
products.name = t.name | |
,products.category_id = t.category_id | |
,products.upd_id = t.upd_id | |
,upd_date =getdate() | |
WHEN NOT MATCHED THEN | |
INSERT INTO VALUES ( | |
(SELECT MAX(id) + 1 FROM products) | |
,t.name | |
,t.category_id | |
,t.upd_id | |
,GETDATE() | |
); | |
COMMIT | |
END TRY | |
BEGIN CATCH | |
ROLLBACK TRAN | |
SELECT ERROR_MESSAGE() | |
END CATCH | |
GO | |
--プロシージャ実行テスト | |
SELECT * FROM products | |
DECLARE @table Products | |
INSERT INTO @table | |
VALUES (1, 'ham toast', '000001', 'test', GETDATE()) | |
,(2, 'steake', '000001', 'test', GETDATE()) | |
EXEC EntryProducts @table | |
--プロシージャ実行後データ確認 | |
SELECT * FROM products |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment