2017-08-20 4 views
2

にデータを追加し、私はテーブルを持っている:私は、SSISとSFTP経由で定期的にエクスポートする必要がTSQL - XMLのルートノード

CREATE TABLE [dbo].[xdOthPay] 
(
    AccountNo char(10) NOT NULL, 
    PaymentDoneOn datetime NULL, 
    PaymentDoneBy char(30) NULL, 
    InvoiceNumber char(10) NULL, 
    AmountPaid decimal(12,3) NULL, 
    Comments char(254) NULL, 
    ClientID char(50) NULL, 
    InstallID char(50) NULL, 
    BatchID char(14) NOT NULL 
) 

。これは、その結果

SELECT 
    AccountNo, 
    PaymentDoneOn, 
    PaymentDoneBy, 
    InvoiceNumber, 
    AmountPaid, 
    Comments 
FROM 
    xdMOBOthPay 
FOR XML PATH ('Payment'), ROOT ('Payments'), ELEMENTS 

::これは私のT-SQL文です

<?xml version="1.0" encoding="utf-8"?> 
<Payments ClientId="10865" xmlns="http://someUrl.com/core/xml/payment"> 
    <Payment> 
     <AccountNo>VALUE</AccountNo> 
     <PaymentDoneOn>VALUE</PaymentDoneOn> 
     <PaymentDoneBy>VALUE</PaymentDoneBy> 
     <InvoiceNumber>VALUE</InvoiceNumber> 
     <AmountPaid>VALUE</AmountPaid> 
     <Comments>VALUE</Comments> 
    </Payment> 
</Payments> 

<Payments> 
    <Payment> 
     <AccountNo> 972140</AccountNo> 
     <PaymentDoneOn>2017-06-08T00:00:00</PaymentDoneOn> 
     <PaymentDoneBy>R Entry BA13177 </PaymentDoneBy> 
     <InvoiceNumber> 3804</InvoiceNumber> 
     <AmountPaid>468.000</AmountPaid> 
     <Comments>Non-Onl Payment </Comments> 
    </Payment> 
... 

非常に近い

輸出の受信機は、この形式を指定しますしかし、私はルート要素(支払い)にデータを取得する必要があります。表ClientIDの列は、ClientID属性としてルート要素に含める必要があります。 ClientIDは、表のすべての行で一貫しています。

私はいくつかのアプローチを検討しましたが、フォーマットが必要ではありません。

おかげ トゥリン

答えて

3

私はむしろvarchar列を使用し、固定幅の文字列を使用しないように、あなたを助言します。このサンプルでは、​​ネームスペースを追加し、必要に応じてXMLを少しずつ変更しています。サンプルではこれを1つの具体的なClientIDのために行いますが、それはあなたが必要とするものです。

名前空間がPayment要素にも適用されるという結果は残念です。それが受け入れられない場合は、XML名前空間なしで生成する回避策と、名前空間属性を挿入する文字列関数を適用する回避策があります。


CREATE TABLE #xdOthPay(
    AccountNo char(10) NOT NULL, 
    PaymentDoneOn datetime NULL, 
    PaymentDoneBy char(30) NULL, 
    InvoiceNumber char(10) NULL, 
    AmountPaid decimal(12,3) NULL, 
    Comments char(254) NULL, 
    ClientID char(50) NULL, 
    InstallID char(50) NULL, 
    BatchID char(14) NOT NULL); 

INSERT INTO #xdOthPay(AccountNo,AmountPaid,BatchID,ClientID,Comments,InstallID,InvoiceNumber,PaymentDoneBy,PaymentDoneOn) 
VALUES(972140,468,'bath-id',10865,'comments','install-id','invoicenr','paymentdoneby','20170101'), 
     (972141,468,'bath-id',10865,'comments','install-id','invoicenr','paymentdoneby','20170101'); 

WITH XMLNAMESPACES(DEFAULT 'http://someUrl.com/core/xml/payment') 
SELECT 
    10865 AS '@clientId', 
    (
     SELECT 
      AccountNo, 
      PaymentDoneOn, 
      PaymentDoneBy, 
      InvoiceNumber, 
      AmountPaid, 
      Comments 
     FROM 
      #xdOthPay AS i 
     WHERE 
      i.ClientID=10865 
     FOR 
      XML PATH ('Payment'), TYPE 
    ) 
FOR 
    XML PATH ('Payments'), ELEMENTS; 

DROP TABLE #xdOthPay; 

結果:

<Payments xmlns="http://someUrl.com/core/xml/payment" clientId="10865"> 
    <Payment xmlns="http://someUrl.com/core/xml/payment"> 
    <AccountNo>972140 </AccountNo> 
    <PaymentDoneOn>2017-01-01T00:00:00</PaymentDoneOn> 
    <PaymentDoneBy>paymentdoneby     </PaymentDoneBy> 
    <InvoiceNumber>invoicenr </InvoiceNumber> 
    <AmountPaid>468.000</AmountPaid> 
    <Comments>comments                                                              </Comments> 
    </Payment> 
    <Payment xmlns="http://someUrl.com/core/xml/payment"> 
    <AccountNo>972141 </AccountNo> 
    <PaymentDoneOn>2017-01-01T00:00:00</PaymentDoneOn> 
    <PaymentDoneBy>paymentdoneby     </PaymentDoneBy> 
    <InvoiceNumber>invoicenr </InvoiceNumber> 
    <AmountPaid>468.000</AmountPaid> 
    <Comments>comments                                                              </Comments> 
    </Payment> 
</Payments> 
+0

こんにちは@TT、私はそこに '' 以下のいくつかの '' ノードも...そして、あなたはあるかもしれないことを、前提と思い質問から。もちろん、 'CHAR'は' VARCHAR'に置き換えられます。あるいは、 'RTRIM()'を使うかもしれません。 – Shnugo

+0

@ Shnugoああ、それは間違ったXMLを与えるかもしれない、それを指摘してくれてありがとう。 –

+0

@ Shnugo私は支払い要素を選択するためにサブクエリを使い始めました。支払い要素も名前空間宣言も取得できることを確認するためだけに始めました。場合によっては、SQL ServerでのXML処理が混乱することがあります。 –

関連する問題