C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLServerで複数のInsertとUpdateをしたい

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■94532 / inTopicNo.1)  SQLServerで複数のInsertとUpdateをしたい
  
□投稿者/ 紅子 (5回)-(2020/04/17(Fri) 09:20:15)

分類:[.NET 全般] 

アップデートとインサートを同時にするというサイトを見て
いろいろ試行錯誤しているのですが、
複数のデータをアップデートとインサートしようとしたのですが
うまくいきません。
どうすればよいのでしょうか?


IF OBJECT_ID(N'tempdb..#TBL', N'U') IS NOT NULL DROP TABLE #TBL;

WITH
TBL (ID, NAME, FLAG)
 AS (
 SELECT 5, 'SS', 0
 UNION SELECT 5, 'S3G', 1
 UNION SELECT 5, 'S4G', 1
 UNION SELECT 5, 'S5G', 1
 )
 SELECT *
 INTO #TBL
 FROM (
   SELECT *
   FROM TBL
   ) AS TBL

SELECT *
FROM #TBL

/*==================================================*/
DECLARE @BumonCode Int = 5;

BEGIN TRY
 BEGIN TRANSACTION;

--------------------------------------------------
  WITH
  INS (ID, NAME, FLAG)
   AS (
   SELECT 5, 'SP', 0
   UNION SELECT 5, 'SS', 0
   UNION SELECT 5, 'S3G', 1
   UNION SELECT 5, 'S4G', 0
   UNION SELECT 5, 'S5G', 1
   )
  UPDATE #TBL
  SET #TBL.Flag = INS.FLAG
  FROM #TBL
  INNER JOIN INS
     ON INS.ID = #TBL.ID
     AND INS.NAME = #TBL.NAME
  IF @@ROWCOUNT = 0
  INSERT INTO #TBL 
  SELECT *
  FROM INS
  
--------------------------------------------------

 COMMIT TRANSACTION;
 SELECT 0
END TRY
BEGIN CATCH
 ROLLBACK TRANSACTION;
 SELECT 1
END CATCH;

/*==================================================*/

SELECT*
FROM #TBL


IF OBJECT_ID(N'tempdb..#TBL', N'U') IS NOT NULL DROP TABLE #TBL;


引用返信 編集キー/
■94534 / inTopicNo.2)  SQLServerで複数のInsertとUpdateをしたい
□投稿者/ 紅子 (6回)-(2020/04/17(Fri) 09:40:39)
2020/04/17(Fri) 09:41:01 編集(投稿者)

さらに調べてみると以下のようにすればできることがわかりました。

  MERGE INTO #TBL AS A
  USING (
    SELECT 5 AS ID, 'SP' AS NAME, 0 AS FLAG
    UNION SELECT 5, 'SS', 0
    UNION SELECT 5, 'S3G', 1
    UNION SELECT 5, 'S4G', 0
    UNION SELECT 5, 'S5G', 1
    
    ) AS B
  ON (
   A.ID = B.ID
   AND A.NAME = B.NAME
   )

  WHEN MATCHED THEN
    UPDATE SET
      A.FLAG = B.FLAG
  WHEN NOT MATCHED THEN
    INSERT (ID, NAME, FLAG)
    VALUES (B.ID, B.NAME, B.FLAG);
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ