Sql ForXml;连接字段返回逗号分隔列表或空字符串

时间:2015-05-15 11:29:08

标签: sql sql-server xml for-xml

我已经查看了几个关于使用FOR XML的SO问题,但是错过了,或者没有找到任何特定于我查询的内容。

幸运的是,或者不是,我需要提交数据的服务希望我的表中的字段作为属性而不是元素提交,这意味着我可以使用FOR XML AUTO。但是它确实需要一些我不确定如何编写正确的sql来实现的东西,我欢迎一些建议。

某些字段(假设我有三个名为Log1,Log2和Log3)需要作为参数调用的一个属性返回日志。如果所有三个日志字段都为空,则它必须是空字符串,或者如果它们包含数据,则需要将它们与逗号连接作为分隔符。我怀疑一个简单的Coalesce不是这里的答案,但我不完全确定还会做什么。

正如我所说,我欢迎一些建议。感谢。

修改

道歉,应该添加一些sql来协助。

SELECT  LandingId,
    VesselId,
    TicketNumber,
    CONVERT(VARCHAR(10),LandingDate1,112) AS landingdate1,
    Log1,
    Log2,
    Log3,
    COALESCE(VesselName,'') AS vesselName,
    VesselOwner
FROM Landings.LandingHeaders AS sale  FOR XML AUTO

Log1,Log2和Log3应该成为日志,如果全部为空,则为空字符串;如果它们包含数据,则为逗号分隔列表。

EDIT2(删除了VesselName和所有者的当前输出以保护机密性)

<sale LandingId="3388" VesselId="1" TicketNumber="1         " landingdate1="20130705" />

嗨,Log值为null,不返回任何内容,不确定是否可以使用coalesce形式生成空字符串或逗号分隔列表。 我知道我需要修剪ticketNumber。

1 个答案:

答案 0 :(得分:1)

最好不要使用for xml auto,而是使用for xml path,因为它可以为您提供更大的灵活性。

你想达到的目标(如果我理解正确的话)可以这样实现(我已经跳过某些领域)

select
    VesselId as '@VesselId',
    TicketNumber as '@TicketNumber',
    isnull(Log1 + ',', '') + isnull(Log2 + ',', '') + isnull(Log3 + ',', '') as '@Log123'
from Landings.LandingHeaders for xml path('sale')

<强>更新

坦率地说,在您的特定情况下,您也可以使用for xml auto来实现您的目标,这是连接字段的关键想法,例如

isnull(Log1 + ',', '') + isnull(Log2 + ',', '') + isnull(Log3 + ',', '')

如果所有三个字段都为空,则获取空字符串;如果非空字符串,则其中一些数据保持不变。