关联多个表

时间:2011-12-18 21:36:36

标签: sql-server sql-server-2008 stored-procedures biztalk biztalk-2010

我试图扩展上述链接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 ...我需要获取第二个表中第一个表的id

然后我需要获得第3和第2表中的id .....我能够将第一张表的id放到第2张表中

但是我无法将第二个表的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>

1 个答案:

答案 0 :(得分: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)的表变量,然后您可以使用它来插入第三个表。