我想根据特定的列标准选择别名并输出所需的 XML。
假设我们有一个名为的表ACCOUNTS
:
姓名年龄 ---------- --- 约翰·多伊 30 玛丽巷 40 爱丽丝鲍勃 50
询问:
;WITH XMLNAMESPACES
(
'http://www.w3.org/2001/XMLSchema-instance' AS abc, 'uri' AS def
)
SELECT
CASE WHEN AGE <= 30 THEN 'BUYER' AS [def:GIRL]
WHEN AGE >=40 THEN 'SELLER' END AS [def:BOY]
FROM ACCOUNTS
FOR XML PATH('abc:OilCompany'), TYPE
输出应该是:
<abc:OilCompany>
<def:GIRL>BUYER</def:GIRL>
<def:BOY>SELLER</def:BOY>
<def:BOY>SELLER</def:BOY>
</abc:OilCompany>
默认情况下,SQL Server 不会为 NULL 值创建节点,因此如果您将查询更改为使用两个 CASE 语句并在没有匹配项时返回 NULL,您将获得您正在寻找的 XML。
小提琴手
同列不同名是无效SQL,需要将两种情况都选择为单独的列:
不幸的是,这个解决方案将 xml 名称空间推送到每个元素中。
避免这种情况的最佳方法,根据这个 anwser https://stackoverflow.com/questions/3242070/how-do-i-remove-redundant-namespace-in-nested-query-when-using-for-xml-path仿佛步入了不那么美好的世界
XML EXPLICIT
留给我们:
这两种解决方案也会导致对同一张表进行 2 次扫描 - 显式简化: