Sql server TSQL-对于XML,将数据添加到根节点

Sql server TSQL-对于XML,将数据添加到根节点,sql-server,xml,tsql,Sql Server,Xml,Tsql,我有一张桌子: 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 c

我有一张桌子:

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 
)
我需要通过SSIS和SFTP定期导出

导出的接收者指定以下格式:

<?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>
...
这非常接近,但我需要将数据放入根元素Payments中。表ClientID中的列需要作为ClientID属性包含在根元素中。ClientID将在表的所有行上保持一致

我已经探索了几种方法,但我没有达到所需的格式

谢谢
Torin

我建议您不要使用固定宽度的char列,而是使用varchar列。该示例添加了名称空间,并对XML进行了略微不同的处理,以获得所需的所有内容。这个示例针对一个特定的ClientID执行此操作,我想这就是您所需要的

结果很不幸,名称空间也应用于Payment元素。如果这是不可接受的,那么有一种变通方法,可以在不使用XML名称空间的情况下生成,也可以应用字符串函数插入名称空间属性

创建表xdOthPay AccountNo char10不为空, PaymentDoneOn日期时间为空, PaymentDoneBy char30空, 发票号码char10空, 金额小数12,3空, 注释char254空, ClientID char50 NULL, InstallID char50空, BatchID char14不为空; 插入xdOthPayAccountNo、AmountPaid、BatchID、ClientID、Comments、InstallID、InvoiceNumber、PaymentDoneBy、PaymentDoneOn 值972140468、'bath-id',10865、'comments','install-id','invoicenr','paymentdoneby','20170101',等等, 972141468,'bath-id',10865,'comments','install-id','invoicenr','paymentdoneby','20170101'; 使用XMLNAMESPACESDEFAULT'http://someUrl.com/core/xml/payment' 选择 10865作为“@clientId”, 选择 不, PaymentDoneOn, PaymentDoneBy, 发票号码, 已付金额, 评论 从…起 照我说的付 哪里 i、 ClientID=10865 对于 XML路径“付款”,类型 对于 XML路径“付款”,元素; 降低工资; 结果:

<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>

您好@TT.,根据我假设的问题,下面可能有几个节点。。。当然,你是对的,CHAR将被VARCHAR替换。或者也可以使用RTRIM。@Shnugo啊,是的,这可能会给出错误的XML,谢谢您指出这一点。@Shnugo我从另一个角度开始,用一个子查询来选择付款元素。。。。只有看到Payment元素也得到了名称空间声明。有时候,SQL Server中的XML处理非常混乱。这是一种非常古老、众所周知且令人讨厌的行为。你可以去看看。重复的名称空间并没有错,但会导致结果膨胀。对于所有情况都没有很好的解决方法…最常见的是创建时没有根属性名称空间和其他值。在对NVARCHARMAX进行转换后,这些部件被插入到字符串级别,例如使用STUFF。然后重新转换为XML。丑陋的
<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>