【问题标题】:Correlating multiple tables关联多个表
【发布时间】:2011-12-18 21:36:35
【问题描述】:

我试图扩展上面的链接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

然后我需要在第三张桌子中获得第一张和第二张桌子的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>

【问题讨论】:

  • 欢迎来到 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
  • ...将长行分成较短的行也会有所帮助。很多。
  • 到底是谁想出了这些表名和列名 ?!?!??!?!?
  • Hey mark_S :) 关于列名和表名,这些是 837 X12files .....只有列是这样的

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


【解决方案1】:

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

因此,虽然您可以使用 @@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) 的表变量,然后您可以将其插入到第三个表中。

【讨论】:

  • 我的数据看起来像这样
    data data data
    数据
    数据 数据
  • @user1104946:请不要将大文本或 XML sn-ps 发布到 cmets - 几乎无法阅读!请改为:更新您的原始问题,方法是编辑并在此处提供该信息 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-15
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多