2014-02-01 4 views
0

Я пытаюсь создать XML для возврата в BizTalk из хранимой процедуры SQL Server, которая облегчит мне дезадаптацию файлов на основе номера Attribution_TIN в нашей базе данных.FOR XML EXPLICIT Идентификатор родителя не среди открытых тегов

мне нужны данные, отформатированные в XML, которые следуют этой структуры:

<ns1:Destination xmlns:ns1="XXX.OptOut_PCPPharmacy_SQL" Attribution_TIN="001"> 
    <Member PCP_ID="01" PCP_FullName="XXX" LastName="XXX" FirstName="XXX" Member_ID="XXX898XXX" Member_Gender="F" Member_Birth_Date="2011-11-08" Program_Name="xxx" Claim_Status="Paid Claim" Dispense_Date="2014-01-21" NDC_Number="000" Drug_Name="Ibuprofen 100 MG/5ML SUSP" Days_Supply="4" Dispensed_Quantity="100" PharmacyName="XXX" PrescribingName="XXX" /> 
    <Member PCP_ID="02" PCP_FullName="XXX" LastName="XXX" FirstName="XXX" Member_ID="XXX898XXX" Member_Gender="F" Member_Birth_Date="2011-11-08" Program_Name="xxx" Claim_Status="Paid Claim" Dispense_Date="2014-01-21" NDC_Number="000" Drug_Name="Ibuprofen 100 MG/5ML SUSP" Days_Supply="4" Dispensed_Quantity="100" PharmacyName="XXX" PrescribingName="XXX" /> 
</ns1:Destination> 
<ns1:Destination xmlns:ns1="XXX.OptOut_PCPPharmacy_SQL" Attribution_TIN="002"> 
    <Member PCP_ID="01" PCP_FullName="XXX" LastName="XXX" FirstName="XXX" Member_ID="XXX898XXX" Member_Gender="F" Member_Birth_Date="2011-11-08" Program_Name="xxx" Claim_Status="Paid Claim" Dispense_Date="2014-01-21" NDC_Number="000" Drug_Name="Ibuprofen 100 MG/5ML SUSP" Days_Supply="4" Dispensed_Quantity="100" PharmacyName="XXX" PrescribingName="XXX" /> 
    <Member PCP_ID="02" PCP_FullName="XXX" LastName="XXX" FirstName="XXX" Member_ID="XXX898XXX" Member_Gender="F" Member_Birth_Date="2011-11-08" Program_Name="xxx" Claim_Status="Paid Claim" Dispense_Date="2014-01-21" NDC_Number="000" Drug_Name="Ibuprofen 100 MG/5ML SUSP" Days_Supply="4" Dispensed_Quantity="100" PharmacyName="XXX" PrescribingName="XXX" /> 
</ns1:Destination> 

У меня есть рабочий стол, что я вытягивать данные из и используя следующий FOR XML EXPLICIT запрос, возвращающий результаты:

SELECT 1 AS Tag 
     ,NULL AS Parent 
     ,'XXX.OptOut_PCPPharmacy_SQL' AS   [ns1:Destination!1!xmlns:ns1] 
     ,PCP1.Attribution_TIN          AS [ns1:Destination!1!Attribution_TIN] 
     ,NULL              AS [Member!2!PCP_ID] 
     ,NULL              AS [Member!2!PCP_FullName] 
     ,NULL              AS [Member!2!LastName] 
     ,NULL              AS [Member!2!FirstName] 
     ,NULL              AS [Member!2!Member_ID] 
     ,NULL              AS [Member!2!Member_Gender] 
     ,NULL              AS [Member!2!Member_Birth_Date] 
     ,NULL              AS [Member!2!Program_Name] 
     ,NULL              AS [Member!2!Claim_Status] 
     ,NULL              AS [Member!2!Dispense_Date] 
     ,NULL              AS [Member!2!NDC_Number] 
     ,NULL              AS [Member!2!Drug_Name] 
     ,NULL              AS [Member!2!Days_Supply] 
     ,NULL              AS [Member!2!Dispensed_Quantity] 
     ,NULL              AS [Member!2!PharmacyName] 
     ,NULL              AS [Member!2!PrescribingName] 
    FROM WorkTable AS PCP1 
UNION 
SELECT 2 AS Tag 
     ,1 AS Parent 
     ,'XXX.OptOut_PCPPharmacy_SQL'      
     ,PCP2.Attribution_TIN 
     ,PCP2.PCP_ID           
     ,PCP2.PCP_Fullname 
     ,PCP2.LastName 
     ,PCP2.FirstName       
     ,PCP2.Member_ID 
     ,PCP2.Member_Gender  
     ,PCP2.Member_Birth_Date 
     ,PCP2.[Program_Name]         
     ,PCP2.Claim_Status            
     ,PCP2.Dispense_Date         
     ,PCP2.NDC_Number          
     ,PCP2.Drug_Name         
     ,PCP2.Days_Supply          
     ,FLOOR(PCP2.Dispensed_Quantity) 
     ,PCP2.PharmacyName       
     ,PCP2.PrescribingName 
    FROM WorkTable AS PCP2 
    ORDER BY [ns1:Destination!1!xmlns:ns1] 
     ,[ns1:Destination!1!Attribution_TIN] 
FOR XML EXPLICIT; 

Это работает для небольших наборов результатов, но как только результаты получить больше я получаю следующее сообщение об ошибке:

Parent tag ID 1 is not among the open tags. FOR XML EXPLICIT requires parent tags to be opened first. Check the ordering of the result set. 

Я считаю, что знаю проблему, но не знаю, как ее исправить. Когда я запускаю выше запрос от моего стола без использования FOR XML EXPLICIT возвращает результаты следующим образом:

Tag  Parent ns1:Destination!1!xmlns:ns1    ns1:Destination!1!Attribution_TIN  Member!2!PCP_ID   Member!2!PCP_FullName 
2 1 XXX.OptOut_PCPPharmacy_SQL 010924601    XXX   XXX 
2 1 XXX.OptOut_PCPPharmacy_SQL 010924601    XXX   XXX 

Это то, что он должен выглядеть для XML EXPLICIT форматировать результаты XML правильно:

Tag  Parent ns1:Destination!1!xmlns:ns1    ns1:Destination!1!Attribution_TIN  Member!2!PCP_ID   Member!2!PCP_FullName 
1 NULL XXX.OptOut_PCPPharmacy_SQL 010924601    NULL   NULL  
2 1 XXX.OptOut_PCPPharmacy_SQL 010924601    XXX   XXX 
2 1 XXX.OptOut_PCPPharmacy_SQL 010924601    XXX   XXX 

Что мне не хватает?

Я попытался с помощью FOR XML PATH без толка, а

ответ

1

После этого еще немного рытья получается, я пытался гнездо с FOR XML PATH совершенно неправильно, поэтому он не работает для меня. Я был в состоянии достичь желаемых результатов, используя этот запрос:

WITH XMLNAMESPACES (
'http://XXX.OptOut_PCPPharmacy_SQL' as ns1 
) 
SELECT Q1.Attribution_Tin AS '@Attribution_TIN', 
(SELECT PCP_ID      AS '@PCP_ID'           
     ,PCP_Fullname     AS '@PCP_FullName' 
     ,LastName      AS '@LastName' 
     ,FirstName     AS '@FirstName'      
     ,Member_ID     AS '@Member_ID' 
     ,Member_Gender    AS '@Member_Gender'  
     ,Member_Birth_Date   AS '@Member_Birth_Date' 
     ,[Program_Name]    AS '@Program_Name'         
     ,Claim_Status     AS '@Claim_Status'           
     ,Dispense_Date    AS '@Dispense_Date'         
     ,NDC_Number     AS '@NDC_Number'         
     ,Drug_Name     AS '@Drug_Name'         
     ,Days_Supply     AS '@Days_Supply'         
     ,FLOOR(Dispensed_Quantity) AS '@Dispensed_Quantity' 
     ,PharmacyName     AS '@PharmacyName'     
     ,PrescribingName    AS '@PrescribingName' 
    FROM WorkTable AS Q2 
    WHERE Q2.Attribution_TIN = Q1.Attribution_TIN 
    FOR XML PATH ('Member'), TYPE 
) 
FROM WorkTable AS Q1 
GROUP BY Attribution_TIN 
FOR XML PATH ('ns1:Destination'); 

Теперь мне нужно, чтобы выяснить, как получить запрос работать быстрее с большими наборами результатов (более 100000). Сейчас требуется около 20 минут для записи в 97 000 записей.

 Смежные вопросы

  • Нет связанных вопросов^_^