2

我正在创建将从我的 C# 应用程序调用的存储过程,并将主/详细信息输入 SQL Server。在 Header 表中,我有TransactionId一个 Identity 列,这样每次插入时我都会获得一个唯一的 ID。当我为详细信息表调用存储过程时,我想使用 Header 中的 PK ID 并将其插入到详细信息的 FK 中。确保我取回刚刚在 Header 表中创建的 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 或 SELECT SCOPE_IDENTITY() 获得自动生成的 TransactionId 标识值,两者都将返回会话中最后一个自动生成的标识。然后,您可以在详细记录的外键中使用此值。

于 2012-10-24T22:21:37.427 回答