1

私には2つの手順があります:usp_inserterpartnerusp_insertlocation

usp_insertpartnerTradingPartnerPK呼び出されるたびに呼び出される行を挿入します。

usp_insertlocationLocationPKPKおよびTradingPartnerFKFKとしての行を挿入します。

この場合、どのように実行します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()現在のスコープの最後のステートメントに対して作成された最新のIDを返します。

詳細はこちら: 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'

2番目の手順が次のような外部プロセスから呼び出された場合:

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の戻り値またはその出力パラメーターの1つとして使用可能になります。

于 2013-02-27T20:46:10.747 に答える