2

C#アプリケーションから呼び出され、マスター/詳細情報をSQLServerに入力するストアドプロシージャを作成しています。ヘッダーテーブルにはTransactionIdIdentity列があり、挿入するたびに一意のIDを取得できます。詳細テーブルのストアドプロシージャを呼び出すときに、ヘッダーのPK IDを使用して、詳細のFKに挿入します。ヘッダーテーブルで作成されたIDを確実に取得するための最良の方法は何ですか?

CREATE TABLE [dbo].[Header835]
(
   [TRANSACTIONID] [int] IDENTITY(1, 1) NOT NULL
   , [FILENAME] [varchar](80) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
   , [TRADINGPARTNERNAME] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
   , [ISACRTL] [numeric](18, 0) NOT NULL
   , [STCRTL] [numeric](18, 0) NOT NULL
   , CONSTRAINT [PK_Header835] PRIMARY KEY CLUSTERED
   (
      [TRANSACTIONID] ASC
   ) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
4

3 に答える 3

3

SCOPE_IDENTITY()を使用する必要があります

DECLARE @headerTransactionId INT;

INSERT INTO dbo.Header835(Filename, TradingPartnerName, IsACrtl, StCrtl)
SELECT 'myFile.txt', 'Joe', 103, 123;

SELECT @headerTransactionId = SCOPE_IDENTITY();    

SQLフィドルの

于 2012-10-24T22:04:41.713 に答える
1

さまざまな方法についての私のブログ投稿をチェックしてください。ここに長所と短所があります。

http://sqlity.net/en/351/identity-crisis/

つまり、コードを次のようにする必要があります。

DECLARE @IdentValues TABLE(v INT);

INSERT INTO [dbo].[Header835](<...  column list ...>) 
OUTPUT INSERTED.[TRANSACTIONID] INTO @IdentValues(v)
VALUES(<... value list ...>);

SELECT v AS IdentityValues FROM @IdentValues;
于 2012-10-24T22:05:50.627 に答える
0

Header835テーブルにレコードを挿入すると、SELECT @@IDENTITYまたはSELECTSCOPE_IDENTITY()を使用してTransactionIdの自動生成されたID値を取得します。どちらも、セッションで最後に自動生成されたIDを返します。その後、この値を詳細レコードの外部キーで使用できます。

于 2012-10-24T22:21:37.427 に答える