【问题标题】:SQL Server: Use output from first insert to insert into second tableSQL Server:使用第一个插入的输出插入第二个表
【发布时间】:2022-01-07 14:10:24
【问题描述】:

我有一个基本的存储过程,可以将新记录添加到具有如下结构的表中。该表还有一列“itemID”,该列设置为自动递增以为每条记录创建唯一 ID。

我想使用 Output 从我插入的新记录中获取此 id,然后使用它将新记录添加到另一个表(Table2 与列 colD、colE、colF)。 Table2 中的 colF 应该是下面的输出,因为这是链接两个表的 id。

这里有人可以告诉我这是如何工作的,因为我对 SQL 还很陌生,以前从未这样做过?

我的存储过程(示例):

ALTER PROCEDURE [dbo].[CreateStuff]
    @colA datetime,
    @colB varchar(50),
    @colC nvarchar(20)
AS
BEGIN
SET NOCOUNT ON;
    INSERT INTO Table1
        (
            colA,
            colB,
            colC
        )
    SELECT  @colA,
            @colB,
            @colC
END

非常感谢您提供的任何帮助,蒂姆。

【问题讨论】:

  • 不,我认为输出子句是理想的场景。只需谷歌它的语法

标签: sql sql-server tsql output sql-insert


【解决方案1】:
BEGIN  
    SET NOCOUNT ON;

    /* Here declare a Table Variable */

    DECLARE @Table_Var TABLE(itemID INT)

    INSERT INTO Table1(colA,colB,colC)
    OUTPUT inserted.itemID INTO @Table_Var(itemID)
    SELECT @colA,@colB,@colC
    
    
    /* Now do the insert into Table 2*/        
    INSERT INTO TABLE2
    SELECT itemID FROM @Table_Var
END

SCOPE_IDENTITY() 仅在您执行单个插入时有效,并且它是您要捕获的值的 IDENTITY 列。它只会返回最后生成的标识值。

除此之外,如果您正在执行多次插入或者它不是标识列,那么您应该使用OUTPUT 子句以及表变量/临时表来捕获插入的值。然后稍后对它们的值做任何你想做的事情(插入另一个表/记录任何内容)。

要了解有关OUTPUT Clause 的更多信息,请查看此链接。

【讨论】:

  • 非常感谢。看起来这正是我想要的。现在将对其进行测试。
  • 我应该在哪里声明 Table2 的其他输入?如果我将它们与上面表 1 的那些一起声明为开始,则会收到错误,即 SELECT 和 INSERT 值的数量不匹配。
  • 现在看看我已经将表变量的名称更改为 @Table_Var ,这是您将在第一次插入之前声明的表,然后您将在 INSERT 语句中使用 OUTPUT 子句来填充它表变量。现在,当您插入 Table2(您在问题中提到的表)时,您将从表变量中选择值插入到 table2。
  • colD, colE, colF 而 colF 是包含 Table1 的 id(输出)的那个。
【解决方案2】:

试试SCOPE_IDENTITY():

ALTER PROCEDURE [dbo].[CreateStuff]
    @colA datetime,
    @colB varchar(50),
    @colC nvarchar(20),
    @Valueout int output
AS
BEGIN
SET NOCOUNT ON;
    INSERT INTO Table1
        (
            colA,
            colB,
            colC
        )
    SELECT  @colA,
            @colB,
            @colC
SET @Valueout = SCOPE_IDENTITY()
END

【讨论】:

  • 感谢您的快速回复 - 这看起来很有趣!我可以在同一过程中插入 Table2 吗?
  • @user2571510 你确实可以
  • 怎么办?只是在下面添加它?
【解决方案3】:

您可以按如下方式在表上创建触发器:

    CREATE TRIGGER Trigger_Name 
       ON  Table_Name 
       AFTER INSERT,UPDATE
    AS 
    BEGIN
       SET NOCOUNT ON;

       INSERT INTO Table1 ( colA, colB, colC )
       SELECT  colA, colB, colC FROM Inserted

    END

【讨论】:

  • 感谢您的快速回复。在那种情况下插入了什么?
  • Inserted 是 SQL server 的一个关键字,它指向您插入的 Table_name。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多