如何在SQL Server的XML结果中使Version字段显示为自闭合标签
解决方案
首先需要说明:你期望输出中的<Version="101"/>属于不合法的XML语法,正确的带属性自闭合标签格式应为<元素名 属性名="属性值"/>(比如<Version value="101"/>)。以下是符合XML规范的修改方案:
修改后的查询语句
SELECT 'ABC.COM' AS 'CompanyName', GETDATE() AS 'TimeOFGeneration', 'ABC' AS 'Address', ( SELECT -- 生成带value属性的自闭合Version标签 (SELECT 101 AS '@value' FOR XML PATH('Version'), TYPE) AS [Version], -- 生成带value属性的自闭合NewVersion标签 (SELECT 101.1 AS '@value' FOR XML PATH('NewVersion'), TYPE) AS [NewVersion], CAST([DATE] AS DATE) AS 'LAUNCHDATE', '365' AS 'DURATION' FROM [TABLE] FOR XML PATH ('DATA'), TYPE , ROOT('SUBDATA') ) AS 'MAINDATA' FOR XML PATH('TIMELINE')
关键修改点
- 通过嵌套子查询结合
FOR XML PATH('元素名'), TYPE的方式,生成带属性的自闭合标签,属性名通过@前缀指定; - 移除了原查询中的
QUOTENAME函数,因为SQL Server在生成XML属性时会自动处理字符串转义,无需手动添加引号; - 修正了原查询中遗漏的逗号、未加方括号的保留字(
DATE、TABLE)等语法错误。
生成的XML结果
<TIMELINE> <CompanyName>ABC.COM</CompanyName> <TimeOFGeneration>2023-10-18T09:09:05.540</TimeOFGeneration> <Address>ABC</Address> <MAINDATA> <SUBDATA> <DATA> <Version value="101"/> <NewVersion value="101.1"/> <LAUNCHDATE>2023-10-18</LAUNCHDATE> <DURATION>365</DURATION> </DATA> </SUBDATA> </MAINDATA> </TIMELINE>
注:如果坚持要生成不符合XML规范的
<Version="101"/>格式,只能通过字符串拼接生成XML,但这种方式会导致XML无法被标准解析器正常处理,不建议使用。
内容的提问来源于stack exchange,提问作者user2728106
相关产品推荐
相关产品推荐

