我正在创建将从我的C#应用程序调用的存储过程,并将主/详细信息输入SQL Server。在Header表中,我将TransactionId
作为标识列,以便每次插入时都会获得唯一的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]
答案 0 :(得分:3)
您将使用SCOPE_IDENTITY()
DECLARE @headerTransactionId INT;
INSERT INTO dbo.Header835(Filename, TradingPartnerName, IsACrtl, StCrtl)
SELECT 'myFile.txt', 'Joe', 103, 123;
SELECT @headerTransactionId = SCOPE_IDENTITY();
答案 1 :(得分: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;
答案 2 :(得分:0)
在Header835表中插入记录后,您将获得带有SELECT @@ IDENTITY或SELECT SCOPE_IDENTITY()的TransactionId的自动生成标识值,两者都将返回会话中最后一个自动生成的标识。 然后,您可以在详细记录的外键中使用此值。