Sql 对于 Xml;连接返回逗号分隔列表或空字符串的字段

Sql ForXml; concatenating fields returning either a comma seperated list or empty string

我已经查看了几个关于使用 FOR XML 的 SO 问题,但要么遗漏了,要么没有找到任何特定于我的查询的内容。

幸运的是,也许不是,我需要向其提交数据的服务希望我的 table(s) 中的字段作为属性而不是元素提交,这意味着我可以使用 FOR XML 汽车。然而,它确实需要一些我不确定如何编写正确的 sql 来实现的东西,对此我欢迎一些建议。

一些字段(假设我有三个名为 Log1、Log2 和 Log3 的字段)需要作为一个属性返回,因为参数的缘故日志。如果所有三个日志字段都是 Null,那么它需要是一个空字符串,或者如果它们包含数据,则需要用逗号作为分隔符连接起来。我怀疑简单的 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 和 Owner 以保护机密的当前输出)

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

假设日志值为空,没有返回任何内容,不确定我是否可以使用一种合并形式来生成空字符串或逗号分隔列表。 我知道我需要 trim 票号。

最好不要使用 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 + ',', '')

如果所有三个字段都为 null 则获取空字符串,并且包含一些数据的非空字符串否则保持不变。