したい。
SQLServer 2005 で。
ちなみにストアドプロシージャとかではなく ASP.NET から SQL 文投げる形で。
ついでに 「更新する場合は変更があった場合のみ更新」 とかにしたい。
SQLServer 2008 だと MERGE というのが使えるらしいのだけど、2005 なので使えなかった…
-- テスト用テーブル
CREATE TABLE [dbo].[Hoge] (
[HogeID] [bigint] NOT NULL,
[HogeCD] [char](3) NOT NULL,
[HogeName] [nvarchar](10) COLLATE Japanese_CI_AS NULL,
CONSTRAINT [PK_Hoge] PRIMARY KEY CLUSTERED (
[HogeID] ASC
) WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF)
)
GO
-- テスト用レコード
INSERT INTO Hoge(HogeID, HogeCD, HogeName) VALUES (10000, '001', 'yamada');
INSERT INTO Hoge(HogeID, HogeCD, HogeName) VALUES (20000, '002', 'tanaka');
※以前色々書いてたんだけど、もっとシンプルで良いのを見つけたので書き直し。
-- あれば更新、なければ登録
UPDATE Hoge SET
HogeCD='001', HogeName='suzuki'
WHERE
HogeID = 10000
AND (HogeCD <> '001' OR HogeName <> 'suzuki') -- 何か変更があった場合のみ更新したい
IF @@ROWCOUNT = 0
INSERT INTO Hoge (
HogeID, HogeCD, HogeName
)
SELECT
10000, '001', 'suzuki'
WHERE
NOT EXISTS ( -- 同じキーが存在しない場合のみ登録する
SELECT TOP 1 1 FROM Hoge WHERE HogeID = 10000
)
UPDATE 文と INSERT 文を IF @@ROWCOUNT = 0 で繋いでやれば良いのか。
なんだー。
↓ ここみた
http://www.ilovex.co.jp/blog/system/cat820/sqlserversql.html
【追記】更に「UPDATEしたのかINSERTしたのか知りたい」ケースが出てきたので修正版。
-- あれば更新、なければ登録
UPDATE Hoge SET
HogeCD='001', HogeName='suzuki'
WHERE
HogeID = 10000
AND (HogeCD <> '001' OR HogeName <> 'suzuki')
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Hoge (
HogeID, HogeCD, HogeName
)
SELECT
10000, '001', 'suzuki'
WHERE
NOT EXISTS (
SELECT TOP 1 1 FROM Hoge WHERE HogeID = 10000
)
IF @@ROWCOUNT > 0
SELECT 'inserted'
ELSE
SELECT ''
END
ELSE
SELECT 'updated'
insertedが返ってきたら登録、updated が返ってきたら更新、
空なら更新なし(変更箇所がなかったとか)
↓ テンプレ
/*
ここに UPDATE 文
*/
IF @@ROWCOUNT = 0
BEGIN
/*
ここに INSERT 文
*/
IF @@ROWCOUNT > 0
SELECT 'inserted'
ELSE
SELECT ''
END
ELSE
SELECT 'updated'