2016-05-11 6 views
1

ヘッダー、ディテール、およびトレーラセクションを含むXMLファイルを作成する必要があります。このXMLファイルのソースデータはデータベースから抽出されるので、私はTSQLを使用します。データ仕様では、サンプルのXSDファイルとサンプルのXMLファイルが提供されています。作成したXMLファイルがサンプルXMLファイルと一致しません。タグは全く同じではありません。サンプルのXMLファイルを複製するにはどうすればいいですか?私は、サンプルXSDファイルをいくつか組み込む必要があるように感じていますが、確かに知るためにXMLを使った経験はあまりありません。 は、これまでのところ、私はこのようなものがあります:提供されたXSDファイルでヘッダー、ディテール、およびトレーラセクションを含むXMLファイルを作成する

DECLARE @tmpHeader TABLE 
([Header Code] varchar(15) NULL, 
[Preferred Provider List Creation Date] datetime NULL, 
[ACO Program Code] int NULL) 

INSERT INTO @tmpHeader 
([Header Code],[Preferred Provider List Creation Date],[ACO Program Code]) 
VALUES 
('HDR_PFPRVDR',CONVERT(date,GETDATE()),'21') 

DECLARE @tmpTrailer TABLE 
([Trailer Code] varchar(15) NULL, 
[Preferred Provider List File Creation Date] datetime NULL, 
[Detail Record Count] int NULL) 

INSERT INTO @tmpTrailer 
([Trailer Code],[Preferred Provider List File Creation Date],[Detail Record Count]) 
SELECT 
'TRL_PFPRVDR',CONVERT(date,GETDATE()),(select count(*) from (
SELECT distinct 
    [ACO Identifier] = 'V130' 
    ,[ACO Preferred Provider TIN] = case when TIN.VendorTaxID is NULL then VEN.VendorTaxID else TIN.VendorTaxID end 
    ,[Old ACO Preferred Provider TIN] = TIN.Old_TaxID 
    ,[ACO Organization Preferred Provider NPI] = NULL 
    ,[ACO Individual Preferred Provider NPI] = PRV.NPINumber 
    ,[ACO Preferred Provider Shared_Savings Program Effective Date] = CDA.EffDate 
    ,[ACO Preferred Provider Shared Savings Program Termination Date] = nullif(CDA.TermDate,'') 
FROM Provider PRV (readuncommitted) 
    LEFT JOIN Vendor VEN (readuncommitted) ON 
     PRV.Vendor_UniqueID = VEN.Vendor_UniqueID 
     and 
     VEN.ods_row_current = PRV.ods_row_current 
    LEFT JOIN TIN (readuncommitted) ON 
     TIN.Vendor_UniqueID = PRV.Vendor_UniqueID 
    JOIN CDA (readuncommitted) ON 
     CDA.LicenseID = TIN.VendorShortName and CDA.TaxID = TIN.VendorTaxID 
    WHERE 
     PRV.ods_row_current = 1 
     ) as A) 

DECLARE @TempExportTable TABLE 
(
    Header XML, 
    Detail XML, 
    Trailer XML 
) 


INSERT INTO @TempExportTable VALUES 
(
(SELECT [Header Code],[Preferred Provider List Creation Date],[ACO Program Code] FROM @tmpHeader FOR XML AUTO, ELEMENTS), 
(SELECT distinct 
    [ACO Identifier] = 'V130' 
    ,[ACO Preferred Provider TIN] = case when TIN.VendorTaxID is NULL then VEN.VendorTaxID else TIN.VendorTaxID end 
    ,[Old ACO Preferred Provider TIN] = TIN.Old_TaxID 
    ,[ACO Organization Preferred Provider NPI] = NULL 
    ,[ACO Individual Preferred Provider NPI] = PRV.NPINumber 
    ,[ACO Preferred Provider Shared_Savings Program Effective Date] = CDA.EffDate 
    ,[ACO Preferred Provider Shared Savings Program Termination Date] = nullif(CDA.TermDate,'') 
FROM PROVIDER PRV (readuncommitted) 
    LEFT JOIN VENDOR (readuncommitted) ON 
     PRV.Vendor_UniqueID = VEN.Vendor_UniqueID 
     and 
     VEN.ods_row_current = PRV.ods_row_current 
    LEFT JOIN TIN (readuncommitted) ON 
     TIN.Vendor_UniqueID = PRV.Vendor_UniqueID 
    JOIN CDA (readuncommitted) ON 
     CDA.LicenseID = TIN.VendorShortName and CDA.TaxID = TIN.VendorTaxID 
    WHERE 
     PRV.ods_row_current = 1 
     FOR XML AUTO, ELEMENTS), 
(SELECT [Trailer Code],[Preferred Provider List File Creation Date],[Detail Record Count] FROM @tmpTrailer FOR XML AUTO, ELEMENTS) 
) 
SELECT 
    Header as '*', 
    Detail as '*', 
    Trailer as '*' 
from @TempExportTable 
FOR XML PATH('ExportList') 

をしかし、私は、この提供されているサンプルのXMLファイルに多くの類似した何かを生産する必要があります:

<?xml version="1.0" encoding="UTF-8"?>   
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified"> 
<xsd:element name="Header" type="HeaderType"/> 
     <xsd:element name="Participants" type="ParticipantsType"/> 
     <xsd:element name="Participant" type="ParticipantType"/> 
     <xsd:element name="Trailer" type="TrailerType"/> 

     <xsd:element name="ACOParticipantData">     
    <xsd:complexType> 
           <xsd:sequence> 
      <xsd:element ref="Header"/> 
              <xsd:element ref="Participants" minOccurs="0" maxOccurs="1"/> 
              <xsd:element ref="Trailer"/> 
           </xsd:sequence> 
        </xsd:complexType> 
     </xsd:element> 

     <xsd:complexType name="HeaderType"> 
        <xsd:sequence> 
           <xsd:element name="HeaderCode" type="HeaderCodeENUM"/> 
           <xsd:element name="FileCreationDate"> 
      <xsd:simpleType> 
                 <xsd:restriction base="xsd:string"/> 
              </xsd:simpleType> 
           </xsd:element> 
           <xsd:element name="ACOProgCode" type="ACOProgCodeType"/>          
        </xsd:sequence> 
     </xsd:complexType> 

     <xsd:complexType name="ParticipantsType"> 
        <xsd:sequence> 
           <xsd:element ref="Participant" maxOccurs="unbounded"/> 
        </xsd:sequence> 
     </xsd:complexType> 

     <xsd:complexType name="ParticipantType">     
    <xsd:sequence> 
     <xsd:element name="ACO_ID" type="OrgType"/> 
     <xsd:element name="TIN" type="xsd:string"/> 
     <xsd:element name="Old_TIN" nillable="true" type="xsd:string"/> 
     <xsd:element name="Org_NPI" nillable="true" type="xsd:string"/> 
     <xsd:element name="Ind_NPI" nillable="true" type="xsd:string"/> 
     <xsd:element name="CCN" nillable="true" type="xsd:string"/> 
     <xsd:element name="PRG_Eff_Dt" type="DateType"/> 
     <xsd:element name="PRG_Term_Dt" nillable="true" type="xsd:string"/> 
    </xsd:sequence> 
     </xsd:complexType> 

     <xsd:complexType name="TrailerType"> 
    <xsd:sequence> 
           <xsd:element name="TrailerCode" type="TrailerCodeENUM"/> 
           <xsd:element name="FileCreationDate">          
              <xsd:simpleType> 
                 <xsd:restriction base="xsd:string"/> 
              </xsd:simpleType> 
           </xsd:element>       
           <xsd:element name="RecordCount"> 
              <xsd:simpleType> 
                 <xsd:restriction base="xsd:integer"> 
                    <xsd:minInclusive value="0"/> 
                    <xsd:maxInclusive value="9999999"/> 
                 </xsd:restriction> 
              </xsd:simpleType> 
           </xsd:element>       
        </xsd:sequence> 
     </xsd:complexType> 

     <xsd:simpleType name="HeaderCodeENUM"> 
        <xsd:restriction base="xsd:string"> 
         <xsd:pattern value="HDR_PFPRVDR"/> 
        </xsd:restriction> 
     </xsd:simpleType> 

     <xsd:simpleType name="ACOProgCodeType"> 
        <xsd:restriction base="xsd:string"> 
         <xsd:pattern value="21"/> 
        </xsd:restriction> 
     </xsd:simpleType> 

     <xsd:simpleType name="TrailerCodeENUM"> 
        <xsd:restriction base="xsd:string"> 
           <xsd:pattern value="TRL_PFPRVDR"/> 
        </xsd:restriction> 
     </xsd:simpleType> 

     <xsd:simpleType name="DateType"> 
        <xsd:restriction base="xsd:string"> 
           <xsd:pattern value="\d{8}"/> 
        </xsd:restriction> 
     </xsd:simpleType> 

     <xsd:simpleType name="OrgType"> 
        <xsd:restriction base="xsd:string"> 
           <xsd:pattern value="V\d{3}"/> 
        </xsd:restriction> 
     </xsd:simpleType> 

</xsd:schema> 
:ここ

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<ACOParticipantData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Header> 
    <HeaderCode>HDR_PFPRVDR</HeaderCode> 
    <FileCreationDate>20160101</FileCreationDate> 
    <ACOProgCode>21</ACOProgCode> 
    </Header> 
    <Participants> 
    <Participant> 
     <ACO_ID>V199</ACO_ID> 
     <TIN>123456789</TIN> 
     <Old_TIN>987654321</Old_TIN> 
     <Org_NPI>1234567890</Org_NPI> 
     <Ind_NPI>1234567890</Ind_NPI> 
     <CCN>123456</CCN> 
     <PRG_Eff_Dt>20160101</PRG_Eff_Dt> 
     <PRG_Term_Dt>20161231</PRG_Term_Dt> 
    </Participant> 
    </Participants> 
    <Trailer> 
    <TrailerCode>TRL_PFPRVDR</TrailerCode> 
    <FileCreationDate>20160101</FileCreationDate> 
    <RecordCount>1</RecordCount> 
    </Trailer> 
</ACOParticipantData>Sample 

は、サンプルのXSDファイルであります

ご迷惑をおかけして申し訳ありません。あなたの本当のテーブルの構造とサンプルデータなし

答えて

1

それは魔法のガラス球を読んだようなものですが、これは近いはず:

私はあなたが避けるかもしれないあなたの詳細データを模擬するために

を別の一時テーブルを作成しました宣言されたXML変数を使用しますが、この場合、各サブノードで「xsi」という宣言を繰り返し取得します。エラーが、迷惑なん...

たぶん、あなたも「XSI」-namespaceを必要としません...

DECLARE @tmpHeader TABLE 
([Header Code] varchar(15) NULL, 
[Preferred Provider List Creation Date] datetime NULL, 
[ACO Program Code] int NULL); 

INSERT INTO @tmpHeader 
([Header Code],[Preferred Provider List Creation Date],[ACO Program Code]) 
VALUES 
('HDR_PFPRVDR',CONVERT(date,GETDATE()),'21'); 

DECLARE @tmpTrailer TABLE 
([Trailer Code] varchar(15) NULL, 
[Preferred Provider List File Creation Date] datetime NULL, 
[Detail Record Count] int NULL); 

INSERT INTO @tmpTrailer 
([Trailer Code],[Preferred Provider List File Creation Date],[Detail Record Count]) 
VALUES ('TRL_PFPRVDR',CONVERT(date,GETDATE()),100); --Replaced your `SELECT COUNT(*) FROM ...` with a fix value 

DECLARE @tmpDetail TABLE(ACO_ID VARCHAR(100),TIN BIGINT,Old_TIN BIGINT,Org_NPI BIGINT,Ind_NPI BIGINT,CCN INT,PRG_Eff_Dt DATE,PRG_Term_Dt DATE); 
INSERT INTO @tmpDetail VALUES('V199',123456789,987654321,1234567890,1234567890,123456,'20160101','20161231'); 

--To avoid repeated namespace declarations: 
DECLARE @Hd XML= 
     ( 
     SELECT h.[Header Code] AS HeaderCode 
       ,h.[Preferred Provider List Creation Date] AS FileCreationDate 
       ,h.[ACO Program Code] AS ACOProgCode 
     FROM @tmpHeader AS h  
     FOR XML PATH('Header'),TYPE 
    ); 
DECLARE @Dt XML= 
     (
     SELECT d.ACO_ID 
       ,d.TIN 
       ,d.Old_TIN 
       ,d.Org_NPI 
       ,d.Ind_NPI 
       ,d.CCN 
       ,d.PRG_Eff_Dt 
       ,d.PRG_Term_Dt 
     FROM @tmpDetail AS d 
     FOR XML PATH('Participant'),ROOT('Participants'),TYPE 
    ); 
DECLARE @Tr XML= 
     (
     SELECT t.[Trailer Code] AS TrailerCode 
       ,t.[Preferred Provider List File Creation Date] AS FileCreationDate 
       ,t.[Detail Record Count] AS RecordCount 
     FROM @tmpTrailer AS t 
     FOR XML PATH('Trailer') 
    ); 

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi) 
SELECT @Hd,@Dt,@Tr 
FOR XML PATH('ACOParticipantData'); 
+0

はご回答いただきありがとうございません!スクリプトの出力は、一番上の行を除き、サンプルファイルとほぼ完全に一致します。 <?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>をトップに追加するにはどうすればよいですか? – jaguin

+0

@jaguin 'FOR XML PATH'では、あなたのXMLに(' <?Put something here?> ')、いわゆる"処理命令 "を追加することは可能ですが、残念ながらXMLの外にはありません。これを読む:http://stackoverflow.com/q/33806454/5089204、それは良い回避策です。また、SQL ServerではUTF-8を直接処理できないことに注意してください。 XMLは常にUnicodeに変換されます。本当ですか、あなたはこのラインが必要ですか? – Shnugo

+0

私は絶対に必要としているかどうかはわかりませんが、 「処理手順」がサンプルに含まれていたので、それを持っていただけでした。私はそれを連結し、XMLをvarchar(max)型として返すことにより、XML宣言を先頭に追加する別の回避策を見つけました。私は@Dt XMLにELEMENTS XSINILを追加したのでNULL値を返すと考えていますが、今は別の名前空間を宣言しています。私は現在、ルートレベルですでに行われているので、別の名前空間を宣言せずにNULLを取得する方法を見つけようとしています。 – jaguin

関連する問題