Корреляция нескольких таблиц - PullRequest
0 голосов
/ 19 декабря 2011

Я пытался продлить вышеуказанную ссылку 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

Моя проблема:

У меня три таблицы .... первые две таблицы имеют id как IDENTITY ... Мне нужно получить id первой таблицы во 2-й таблице

Затем мне нужно получить id 1-й и 2-й таблицы в 3-й таблице ..... Я смог получить id первой таблицы во 2-й таблице

Но я не могу получить id 2-й таблицы в 3-ю таблицу ............ Я использую адаптер 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 из 2-й таблицы в 3-ю ....... есть так много циклов в xml, поэтому мне нужно получить соответствующие идентификаторы в 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 Ответ

0 голосов
/ 19 декабря 2011

Ну, ваша главная проблема: вы не просто вставляете одну строку, а целую кучу строк!

Таким образом, хотя вы можете использовать @@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.

Теперь для вашей второй таблицы - есть ли какой-нибудь столбец, с которым вы можете связать первый и второй вставленные идентификаторы? Вам нужно было бы захватить вставленные значения идентификаторов из второй INSERT в ту же переменную таблицы, но вам нужно как-то узнать, с каким ID1 связать с ID2 - и я, честно говоря, не понимаю, как это будет быть сделано в ваших заявлениях .....

Но в итоге у вас будет табличная переменная с n строками (ID1, ID2), которую вы затем сможете использовать для вставки в третью таблицу.

...