【问题标题】:Calling stored procedure from another stored procedure SQL Server从另一个存储过程 SQL Server 调用存储过程
【发布时间】:2012-02-10 03:09:30
【问题描述】:

我有 3 个插入存储过程,每个 SP 在 2 个不同的表中插入数据

Table 1          Table 2                
idPerson         idProduct             
name             productName            
phoneNumber      productdescription     
FK-idProduct

表 1 的 SP 表 2 的 SP

create procedure test1                create procedure test2
WITH                                  WITH 
EXECUTE as caller                     EXECUTE as caller
AS                                    AS
declare                               declare

@idPerson int,                        @idProduct int,
@name varchar(20),                    @productName varchar(50),
@phone varchar(20)                    @productoDescription varchar(50)


  SET nocount on;                     SET nocount on;
    Begin                             Begin
      insert into table1(                insert into table2(
                idPerson,                          idProduct,
                name,                              productName,
                phone)                             productDescription)
          values(                            values(
                @idPerson,                         @idProduct,
                @name,                             @productName,
                @phone)                            @productDescription)
      end                               end

我需要从存储过程测试 1 中调用存储过程测试 2 并将 FK-ID 插入到表 1 中

【问题讨论】:

    标签: sql sql-server sql-server-2005 stored-procedures


    【解决方案1】:

    只需从test1 拨打test2 即可:

    EXEC test2 @newId, @prod, @desc;
    

    确保使用 SCOPE_IDENTITY() 获取@id,它获取插入到同一范围内的标识列中的最后一个标识值:

    SELECT @newId = SCOPE_IDENTITY()
    

    【讨论】:

    • 会在table1中插入idPerson、name、phone和idProduct,在表2中插入idProduct、productName和productDescription吗?
    • @@SCOPE_IDENTITY 不是一个东西。使用 SCOPE_IDENTITY()
    【解决方案2】:

    您可以在 test2 中添加一个 OUTPUT 参数,并在 INSERT 之后将其设置为新的 id:

    SELECT @NewIdOutputParam = SCOPE_IDENTITY()
    

    然后在 test1 中,像这样检索它:

    DECLARE @NewId INTEGER
    EXECUTE test2 @NewId OUTPUT
    -- Now use @NewId as needed
    

    【讨论】:

    【解决方案3】:

    首先,如果table2 的 idProduct 是一个身份,则在该表上设置IDENTITY_INSERT 之前,您无法显式插入它

    SET IDENTITY_INSERT table2 ON;
    

    在插入之前。

    因此,二选一,您修改存储的第二个并仅使用参数 productNameproductDescription 调用它,然后获取新 ID

    EXEC test2 'productName', 'productDescription'
    SET @newID = SCOPE_IDENTIY()
    

    或者您已经拥有该产品的 ID,并且您不需要调用 SCOPE_IDENTITY() 并且可以使用该 ID 在 table1 上进行插入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      相关资源
      最近更新 更多