61
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

レコードがあればUPDATE, なければINSERTしたい

Last updated at Posted at 2013-10-02

したい。

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'
61
55
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?