0

我试图延长上面的链接http://blogs.msdn.com/b/biztalkcpr/archive/2009/10/05/inserting-parent-child-records-with-identity-column-using-wcf-sql-adapter-in-one-transaction.aspx#comments进行相关的多个表

我的问题是:

我有三个表....前两个表有idIDENTITY ...我需要得到在第二个表

然后我需要在第3台第1和第2台的id第一个表格的id .....我是能够得到第一台id到第二台

但我无法将第二张表的id放入第三张表...........我正在使用WCF SQL适配器来使用存储过程,并且我的存储过程如下所示:

CREATE Procedure [dbo].[InsertHeader] 
(
    @parHeader As Header READONLY, 
    @parHeader_Details As HeaderDetails READONLY, 
    @parHeader_Details1 As HeaderDetails1 READONLY 
) 
AS 
SET NOCOUNT ON 

BEGIN 

DECLARE @id int, @id1 int 

INSERT INTO EDI834_5010_Header([File_Name_EDI834], [ST01], [ST02], [ST03], 
           [BGN01__TransactionSetPurposeCode], 
           [BGN02__TransactionSetIdentifierCode], 
           [BGN03__TransactionSetCreationDate], 
           [BGN04__TransactionSetCreationTime], 
           [BGN08__ActionCode], [SE01], [SE02]) 
    SELECT 
     [File_Name_EDI834], [ST01], [ST02], [ST03], 
     [BGN01__TransactionSetPurposeCode], [BGN02__TransactionSetIdentifierCode], 
     [BGN03__TransactionSetCreationDate], [BGN04__TransactionSetCreationTime], 
     [BGN08__ActionCode], [SE01], [SE02] 
    FROM @parHeader; 

SET @id = @@IDENTITY; 

INSERT INTO EDI834_5010_2000([Header_Id], [INS01__InsuredIndicator], 
           [INS02__IndividualRelationshipCode], 
           [INS03__MaintenanceTypeCode], 
           [INS04__MaintenanceReasonCode], 
           [INS05__BenefitStatusCode]) 
    SELECT @id, [INS01__InsuredIndicator], [INS02__IndividualRelationshipCode], 
      [INS03__MaintenanceTypeCode], [INS04__MaintenanceReasonCode], 
      [INS05__BenefitStatusCode] 
    FROM @parHeader_Details; 

SET @id1 = @@IDENTITY; 

INSERT INTO EDI834_5010_2300Loop([Id_Header_Id], [Id_Loop2000], 
            [HD01_MaintenanceTypeCode], [HD03_InsuranceLineCode], 
            [HD04_PlanCoverageDescription]) 
    SELECT @id, @id1, 
      HD01_MaintenanceTypeCode, HD03_InsuranceLineCode, 
      HD04_PlanCoverageDescription 
    FROM @parHeader_Details1; 

    RETURN @id1; 
END 

什么我需要在我的存储过程来改变以获得第二表的id到3 .......有这么多的循环中的XML,所以我需要得到相应的ID在第3台

而我的数据看起来像这样

<Header details> 

     <Header_Details1> data </Header_Details> 

      <Header_Details1> data </Header_Details> 

      <Header_Details1> data </Header_Details> 

    <Header_details> 

    <Header details> 

     <Header_Details1> data </Header_Details> 

      <Header_Details1> data </Header_Details> 

      <Header_Details1> data </Header_Details> 

    <Header_details> 

+1

欢迎来到StackOverflow:如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”)格式和语法突出显示它! – 2011-12-18 21:38:37

+1

......并且将较长的一行分成较短的一行也会有所帮助。很多。 – kol 2011-12-18 21:41:29

+0

谁在地球上出现这些**表格和列名**??????!?!? – 2011-12-18 21:47:42

回答

0

那么,你的主要问题是:你不只是插入一行 - 而是一大堆行!

因此,尽管你可以使用@@IDENTITY得到最后插入的标识值(顺便说一句:我会建议使用SCOPE_IDENTITY()代替 - see here as for why) - 这将仅工作针对单行!

你需要的是一种机制,可以输出多种插入身份 - use the OUTPUT clause

DECLARE @InsertedIDs TABLE (ID1 INT, ID2 INT) 

INSERT INTO EDI834_5010_Header(......) 
OUTPUT Inserted.ID INTO @InsertedIDs(ID1) 
SELECT 
    ....... 
FROM @parHeader; 

对于第一条语句,这将输出所有插入的标识值插入到表变量@InsertedIDs

现在为您的第二个表 - 是否有任何列,您可以将第一个和第二个插入的ID关联?您需要从第二个INSERT中将插入的标识值捕获到同一个表变量中,但是您需要知道哪个ID1ID2相关联 - 而且我很坦率地没有看到您的陈述中将如何完成。 ...

但最后,你会有一个表格变量,其中有n行(ID1, ID2),然后你可以使用它插入你的第三个表格。

+0

我的数据看起来像这样

<部首细节> 数据 数据 数据 <部首细节> 数据 数据 数据
user1104946 2011-12-18 23:04:36

+0

@ user1104946:请**不要**后大文本或XML片段为注释 - 几乎不可能阅读!请改为:**更新**您的原始问题**编辑**并在那里提供该信息 - 谢谢! – 2011-12-19 05:49:46