簡體   English   中英

如何在SQL Server程序的另一個表中調用作為PK值的FK值

[英]How to call a FK value that is a PK value in another table for SQL server procedures

我有2個程序: usp_inserterpartnerusp_insertlocation

usp_insertpartner調用時, usp_insertpartner插入一行名為TradingPartnerPK的行。

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'

謝謝!!

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'

使用帶有identity columnsscope_identity()作為主鍵示例:

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 |

如果您在單獨的SP中執行此操作,則usp_inserterpartner應在執行insert語句或使用輸出參數保存此值后返回Scope_Identity()值(伙伴的PK)。

然后,當您執行位置sp時,PK值可用作usp_inserterpartner的返回值或其中一個輸出參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM