0

我试图扩展上述链接http://blogs.msdn.com/b/biztalkcpr/archive/2009/10/05/inserting-parent-child-records-with-identity-column-using-wcf-sql-适配器合一事务.aspx#comments

我的问题是:

我有三张桌子......前两张桌子有id......IDENTITY我需要在第二张桌子上拿到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第二个表变为第三个....... xml 中有很多循环,所以我需要在第三个表中获取适当的 id

我的数据看起来像这样

 <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>

4

1 回答 1

0

好吧,您的主要问题是:您不只是插入一行 - 而是一大堆行!

因此,虽然您可以使用@@IDENTITY来获取最后插入的标识值(顺便说一句:我建议SCOPE_IDENTITY()改为使用 -请参阅此处了解原因) - 这适用于单行!

您需要的是一种输出多个插入身份的机制 -使用 OUTPUT 子句

DECLARE @InsertedIDs TABLE (ID1 INT, ID2 INT)

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

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

现在对于您的第二个表 - 是否有任何列可以关联第一个和第二个插入的 ID?您需要将插入的标识值从第二个捕获INSERT到同一个表变量中,但是您需要以某种方式知道要与哪个ID1相关联ID2-坦率地说,我不知道在您的陈述中如何做到这一点.... .

但最后,您将拥有一个包含 n 行的表变量,(ID1, ID2)然后您可以将其插入到第三个表中。

于 2011-12-18T21:52:55.950 回答