2

簡単にするために、2 つのテーブルがあるとします。

user table (id, email)

user log table (id, date)

user テーブルに挿入される ID は何でも、同じ ID を user_log テーブルに挿入する必要があります。そうしないと、トランザクションが失敗するはずです。

これどうやってするの

BEGIN TRANSACTION

INSERT into user(id, email) OUTPUT Inserted.id (1, 'a@x.com', 'x'), (2, 'b@x.com', 'y')  

// I also want to be able to do
INSERT into user_log(id, date) values(1, date), (2, date) 

COMMIT TRANSACTION
4

2 に答える 2

7

出力を user_log テーブルに直接挿入できます。

BEGIN TRANSACTION

INSERT INTO [User] (ID, Email)
OUTPUT inserted.id, CURRENT_TIMESTAMP INTO user_log(id, date)
VALUES (1, 'a@x.com'), (2, 'b@x.com');

COMMIT TRANSACTION  

SQL Fiddle の例


ID を返す必要がある場合は、2 番目のOUTPUT句を追加するだけです。

BEGIN TRANSACTION

INSERT INTO [User] (ID, Email)
OUTPUT inserted.id, CURRENT_TIMESTAMP INTO user_log(id, date)
OUTPUT inserted.id                      
VALUES (1, 'a@x.com'), (2, 'b@x.com');

COMMIT TRANSACTION  
于 2014-10-16T09:15:45.647 に答える
0

方法 1 - OUTPUT を使用した「二重挿入」

長所:単一のステートメント、隠しトリガーなし (方法 2)。

短所:このステートメントでのみ機能します。つまり、すべての挿入イベントをキャプチャするわけではありません。

INSERT INTO dbo.users (id)
  OUTPUT inserted.id
  INTO user_log (id)
VALUES (9)
     , (3)
     , (7)
;

方法 2 - トリガー

長所:すべての挿入イベントをキャプチャします

短所:トリガーは「隠された」メカニズムです

CREATE TRIGGER user_log_after_insert
  ON dbo.users
    AFTER INSERT
  AS
BEGIN
  INSERT INTO dbo.user_log (id)
  SELECT id
  FROM   inserted
  ;
END
;

方法 3 - 一時テーブル

方法 1 をサポートしていない古いバージョンの SQL Server を使用する場合の完全性のために含まれています。

CREATE TABLE #temp (
   id int
);

INSERT INTO #temp (id) VALUES (9);
INSERT INTO #temp (id) VALUES (3);
INSERT INTO #temp (id) VALUES (7);

BEGIN TRAN
  INSERT INTO dbo.users (id)
  SELECT id
  FROM   #temp
  ;
  INSERT INTO dbo.user_log (id)
  SELECT id
  FROM   #temp
  ;
COMMIT TRAN
于 2014-10-16T09:17:56.157 に答える