1

以下のコードは既存のレコードを正常に更新していますが、詳細が一致しない新しいレコードを挿入しません。コードがコンパイルされ、エラー メッセージがスローされない理由がわかりません。私は明らかな何かを見逃したと確信しています。参考までに、大文字と小文字を区別する照合で SQL Server 2008 を使用していますが、それがどのように違いを生むのかわかりません。正常に動作する他の MERGE ケースがありますが、うまく動作しないのはこのケースだけです。

更新の動作を確認するには、DEBUG 変数宣言の colorid を変更して、insert ステートメントの値と同じにします。

BEGIN TRY 
    DROP TABLE #adr_test
END TRY
BEGIN CATCH
    -- nothing to drop
END CATCH

CREATE TABLE #adr_test
(
    style NVARCHAR(5)
    ,size_id INT
    ,colour_id INT
    ,cost MONEY
)

INSERT INTO #adr_test (style, size_id, colour_id, cost) 
VALUES ('ADR01', 100, 101, 99.99)

/*DEBUG*/
DECLARE @style NVARCHAR(5) = 'ADR01'
DECLARE @sizeid INT = 100
DECLARE @colourid INT = 999
DECLARE @ctncost MONEY = 1.50
/*END DEBUG*/

MERGE #adr_test AS Tgt
USING (SELECT style, size_id, colour_id, cost
       FROM #adr_test                           
       WHERE style = @style
         AND size_id = @sizeid
         AND colour_id = @colourid) AS Src ON Src.style = Tgt.style
                                           AND Src.size_id = Tgt.size_id
                                           AND Src.colour_id = Tgt.colour_id

WHEN MATCHED AND Tgt.cost <> @ctncost 
   THEN
      UPDATE SET Tgt.cost = @ctncost

WHEN NOT MATCHED BY TARGET 
   THEN 
      INSERT (style, size_id, colour_id, cost)
      VALUES (@style, @sizeid, @colourid, @ctncost);


SELECT * FROM #adr_test
4

1 に答える 1