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>