(ページの作成: == 環境 == *DBMS = SQL Server 2005ぐらい == UPSERTとは == *データベーステーブルへデータを登録する際、同じキーだったらUPDATE、同じキー...) |
Dondariadmin (トーク | 投稿記録) |
||
93行目: | 93行目: | ||
*でも、まあ、このレイヤなら冗長でもいいか。 | *でも、まあ、このレイヤなら冗長でもいいか。 | ||
+ | |||
+ | [[Category:SQL]] |
CREATE TABLE shouhin ( shouhin_code int , shouhin_name nvarchar(100) , shouhin_bunrui_code int , CONSTRAINT "PK_shouhin" PRIMARY KEY CLUSTERED (shouhin_code ASC) );
CREATE PROCEDURE upsert_shouhin @shouhin_code int = NULL ,@shouhin_name nvarchar(100) = NULL ,@shouhin_bunrui_code int = NULL AS DECLARE @sqlstr NVARCHAR(max) , @setstr NVARCHAR(max) , @paramstr NVARCHAR(max) ; -- ■■パラメータのチェック IF @shouhin_code IS NULL RETURN -1; -- ■■UPDATEしてみる -- ベースとなるUPDATE SQL SET @sqlstr = ' UPDATE shouhin {setstring} WHERE shouhin_code = @shouhin_code '; -- ■UPDATE文文字列を組み立てる(指定されたパラメータだけ更新する) SET @setstr = ; IF @shouhin_name IS NOT NULL SET @setstr = @setstr + 'shouhin_name = @shouhin_name,'; IF @shouhin_bunrui_code IS NOT NULL SET @setstr = @setstr + 'shouhin_bunrui_code = @shouhin_bunrui_code,'; -- ■"SET A=1,B=2"の文字列に整形し、ベースSQLにはめ込み IF RIGHT(@setstr, 1) = ',' SET @setstr = LEFT(@setstr, LEN(@setstr) - 1); SET @setstr = 'SET ' + RTRIM(@setstr); SET @sqlstr = REPLACE(@sqlstr, '{setstring}', @setstr); -- ■完成したUPDATE SQLテキストを実行する SET @paramstr = N' @shouhin_code int , @shouhin_name nvarchar(100) , @shouhin_bunrui_code int '; EXECUTE sp_executesql @sqlstr , @paramstr , @shouhin_code = @shouhin_code , @shouhin_name = @shouhin_name , @shouhin_bunrui_code = @shouhin_bunrui_code ; -- ■■UPDATE対象が無かった場合はINSERTする IF @@ROWCOUNT < 1 INSERT INTO shouhin ( shouhin_code, shouhin_name, shouhin_bunrui_code) VALUES ( @shouhin_code, @shouhin_name, @shouhin_bunrui_code); -- ROWCOUNTでも返しとく RETURN @@ROWCOUNT;
exec upsert_shouhin 101,'鉛筆HB',1;
exec upsert_shouhin 101,'鉛筆HB 1ダース',99; exec upsert_shouhin 102,'鉛筆2B 1ダース',99;