簡體   English   中英

SQL Server和C#主/明細插入

[英]SQL Server and C# Master / Detail Insert

我正在創建將從我的C#應用​​程序中調用的存儲過程,並將在SQL Server中輸入主/詳細信息。 在頁眉表上,我將TransactionId作為“身份”列,以便每次插入時都獲得唯一的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]

您將想要使用SCOPE_IDENTITY()

DECLARE @headerTransactionId INT;

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

SELECT @headerTransactionId = SCOPE_IDENTITY();    

SQL小提琴示例

在這里查看有關不同方法的博客文章,並了解其優缺點:

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;

在Header835表中插入一條記錄后,您將獲得帶有SELECT @@ IDENTITY或SELECT SCOPE_IDENTITY()的TransactionId的自動生成的身份值,這兩者都將返回您會話中最后一個自動生成的身份。 然后,您可以在明細記錄的外鍵中使用此值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM