将OUTPUT Insert.id插入到多个值插入中的另一个表中



为了简单起见,假设我有两个表

user table (id, email)

user log table (id, date)

无论在用户表中插入哪个id,都应该在userlog表中插入相同的id,否则事务也会失败。

我该怎么做这个

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

您可以将输出直接插入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,你可以添加第二个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  

方法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

相关内容

  • 没有找到相关文章

最新更新