【问题标题】:How do I get a stored procedure to insert @@identity of previous inserts AUTO ID [closed]如何获得一个存储过程来插入先前插入的@@identity AUTO ID [关闭]
【发布时间】:2020-03-31 15:46:33
【问题描述】:

上图为订单明细表,orderID为外键参考订单表。

这是我的订单表,当通过下面的存储过程插入表时,它将生成一个 id。 PK订单ID

插入表的存储过程将首先发生,这将生成一个 orderID。然后我将在下面运行这个存储过程,希望使用 @@identity 将最后插入的 orderID 从订单插入到 Orderdetails 表中

但是当我尝试插入它时会出现这个错误,说 orderID 为 null

我是否编写了错误的 SQL 语句来执行我想要的将先前生成的 ID 从一个表插入到另一个表的操作

【问题讨论】:

  • 欢迎来到 Stack Overflow,Cdob。考虑提供更多信息,而不需要图像和一些代码的外部链接,以便人们知道如何为您提供帮助。欲了解更多信息,请查看How To Ask
  • 我没有阅读/看过你的图片,因为它们不太可能有帮助。如果您确实想提供代码或数据,请使用text,以便我们可以使用这些信息。但是,我建议查看OUTPUT 子句。
  • 您可能还想避免使用@@identity。看到这个问题:stackoverflow.com/questions/1920558/…
  • 我已经投票结束这个话题,因为 OP 希望我们转录他们的代码来帮助他们。因此,我们无法复制他们的问题。

标签: c# sql asp.net sql-server database


【解决方案1】:

要在 testinsert666 中使用 @@IDENTITY,您需要在过程 testinsert666 中创建 @@IDENTITY 的插入。 testinsert666 只能在它生成的同一会话中使用。 见@@IDENTITY (Transact-SQL)

【讨论】:

    【解决方案2】:

    testinsert666 中删除第 13 行。您正在传递 OrderID,因此您不需要在那里分配它。任何对@@identity(或者最好是scope_identity())的调用都在`testinsert333'中。

    【讨论】:

      【解决方案3】:

      你错过了一些东西。 首先,您不能调用 @@IDENTITY。它的目的是保存您刚刚插入的行的标识值。此外,它还存在范围问题,因此您应该改用 SCOPE_IDENTITY。

      您的第一个过程需要将插入的标识返回到外部包装器。这可以通过使用 OUTPUT 参数来完成。

      CREATE PROCEDURE dbo.testinsert333
      (
          @TableID TINYINT
          ,@OrderID   INT OUTPUT
      )
      AS
      BEGIN
          INSERT INTO dbo.Orders (Orders.TableID)
          VALUES (@TableID)
          SET @OrderID = SCOPE_IDENTITY()
      END
      

      您的第二个过程只需要接受@OrderID。该线程无法从其他线程中获取插入的标识值。它必须作为参数进来。

      CREATE PROCEDURE dbo.testinsert666
      (
          @OrderID    INT
          ,@ProductID INT
          ,@Price INT
          ,@Quantity SMALLINT
          ,@OrderStatus BIT
      )
      AS
      BEGIN
          INSERT INTO dbo.OrderDetails
                      (
                          OrderID
                          ,ProductID
                          ,Price
                          ,Quantity
                          ,OrderStatus
                      )
          SELECT  @OrderID
                  ,@ProductID
                  ,@Price
                  ,@Quantity
                  ,@OrderStatus
      END
      GO
      

      现在要将所有这些联系在一起,需要将它们一起调用,如下例所示。

      BEGIN
          DECLARE @OrderID INT
          EXEC dbo.testinsert333 @TableID = 1, @OrderID = @OrderID OUTPUT
      
          EXEC dbo.testinsert666
                  @OrderID = @OrderID
                  ,@ProductID = @ProductID
                  ,@Price = @Price
                  ,@Quantity = @Quantity
                  ,@OrderStatus = @OrderStatus
      END
      

      但是,最好的方法是将这两个过程嵌套为一个,如下所示。

      CREATE dbo.usp_AllInWonder
      (
          @TableID INT
          ,@ProductID INT
          ,@Price INT
          ,@Quantity SMALLINT
          ,@OrderStatus BIT
      )
      AS
      BEGIN
      
          DECLARE @OrderID INT
      
          INSERT INTO dbo.Orders (Orders.TableID)
          VALUES (@TableID)
      
          SET @OrderID = SCOPE_IDENTITY()
      
          INSERT INTO dbo.OrderDetails
              (
                  OrderID
                  ,ProductID
                  ,Price
                  ,Quantity
                  ,OrderStatus
              )
          SELECT  @OrderID
                  ,@ProductID
                  ,@Price
                  ,@Quantity
                  ,@OrderStatus
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 2016-03-28
        • 2018-09-15
        相关资源
        最近更新 更多