SQL Server和C#主/详细信息插入

时间:2012-10-24 21:32:58

标签: c# sql-server stored-procedures transactions master-detail

我正在创建将从我的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]

3 个答案:

答案 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();    

SQL Fiddle示例

答案 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的自动生成标识值,两者都将返回会话中最后一个自动生成的标识。 然后,您可以在详细记录的外键中使用此值。