1

我有 2 个程序:usp_inserterpartnerusp_insertlocation.

usp_insertpartnerTradingPartnerPK每次调用时插入一行调用。

usp_insertlocation插入一行LocationPK作为 PK 和TradingPartnerFK作为 FK。

usp_insertlocation @TradingPartnerFK = the TradingPartnerPK在这种情况下我该如何执行?

我当前的代码如下:

    CREATE PROCEDURE usp_insertLocation

    @LocationPK int,
    @TradingPartnerFK int,
    @Account varchar (255),
    @Region varchar (255)

    AS
    BEGIN
    SELECT @TradingPartnerFK = Trading_Partner.
    INSERT INTO Location (LocationPK,TradingPartnerFK,Account,Region)
    VALUES (@LocationPK,@TradingPartnerFK,@Account,@Region)

    END

exec usp_insertLocation 1, @TradingPartnerFK = ??????????, 'Nike', 'Americas'

谢谢!!

4

3 回答 3

2

SCOPE_IDENTITY()将返回为当前范围内的最后一条语句创建的最新标识。

更多信息在这里:http: //msdn.microsoft.com/fr-fr/library/ms190315 (v=sql.100).aspx


您将能够使用它的方式实际上取决于您如何进行插入。

如果您在第一个 StoredProcedure 中并SCOPE_IDENTITY()按照我之前所说的那样使用:

由于您不能在exec命令中使用函数,因此您必须执行以下操作:

declare @fkid int 
set @fkid = SCOPE_IDENTITY()
exec usp_insertLocation 1, @TradingPartnerFK = @fkid, 'Nike', 'Americas'

如果从外部进程调用第二个程序,例如:

exec usp_insertpartner [...]
exec usp_insertlocation [...]

您将不得不使用@@identity,因为您超出了初始范围。

所以你的电话看起来像这样:

exec usp_insertLocation 1, @TradingPartnerFK = @@identity, 'Nike', 'Americas'
于 2013-02-27T20:01:50.573 回答
2

使用scope_identity()withidentity columns作为主键示例:

SQL小提琴

MS SQL Server 2008 架构设置

create table TradingPartner (
  PartnerPK int not null identity(1,1) primary key,
  SomePartnerData varchar(100)

  )

create table Location(
  LocationPK int not null identity(1,1) primary key,
  TradingPartnerFK int not null,
  SomeLocationData varchar(100),
  foreign key (TradingPartnerFK) references TradingPartner (PartnerPK)
  )

go

create procedure usp_insert_partner
  @SomePartnerData varchar(100)
as
begin
  declare @PartnerPK int
  insert TradingPartner (SomePartnerData) values (@SomePartnerData)
  set @PartnerPK = scope_identity()
  return @PartnerPK
end

go

create procedure usp_insert_location
  @TradingPartnerPK int,
  @SomeLocationData varchar(100)
as
begin
  declare @LocationPK int
  insert Location (TradingPartnerFK, SomeLocationData) 
    values (@TradingPartnerPK, @SomeLocationData)
  set @LocationPK = scope_identity()
  return @LocationPK
end

查询 1

declare @PartnerPK int

exec @PartnerPK = usp_insert_partner 'Some Partner 1'

exec usp_insert_location @PartnerPK, 'Some Location 1'

exec @PartnerPK = usp_insert_partner 'Some Partner 2'

exec usp_insert_location @PartnerPK, 'Some Location 2'

select *
from Location l
  join TradingPartner p on l.TradingPartnerFK = p.PartnerPK

结果

| LOCATIONPK | TRADINGPARTNERFK | SOMELOCATIONDATA | PARTNERPK | SOMEPARTNERDATA |
----------------------------------------------------------------------------------
|          5 |                4 |  Some Location 1 |         4 |  Some Partner 1 |
|          6 |                5 |  Some Location 2 |         5 |  Some Partner 2 |
于 2013-02-27T20:44:50.657 回答
0

如果您在单独的 SP 中执行此操作,您的 usp_inserterpartner 应在执行插入语句或使用输出参数保存此值后返回 Scope_Identity() 值(合作伙伴的 PK)。

然后,当您执行位置 sp 时,PK 值可用作 usp_inserterpartner 的返回值或它的输出参数之一。

于 2013-02-27T20:46:10.747 回答