如何使用SQL Server导出格式化XML输出
SQL Server 2016 生成符合要求的XML输出解决方案
现有代码
SELECT * FROM [GRADUATE] FOR XML PATH('applicant'), ROOT('applicantsuniversity'), ELEMENTS XSINIL;
问题1:添加XML声明行
SQL Server 的 FOR XML 语句默认不会输出 XML 声明(如 <?xml version="1.0" encoding="UTF-8"?>),需手动拼接字符串实现:
- 将查询结果转换为字符串类型
- 拼接声明前缀,注意编码要和实际输出匹配(若使用
NVARCHAR对应 UTF-16,需将编码声明改为UTF-16)
示例代码:
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + CAST(( SELECT * FROM [GRADUATE] FOR XML PATH('applicant'), ROOT('applicantsuniversity'), ELEMENTS ) AS VARCHAR(MAX)) AS FormattedXML;
注意:如果数据库字段包含 Unicode 字符,建议使用
NVARCHAR(MAX),同时声明编码为UTF-16。
问题2:处理NULL值,避免xsi:nil属性
原代码中的 ELEMENTS XSINIL 会给NULL值字段添加 xsi:nil="true" 属性。要输出空元素(如 <FieldName></FieldName>)而非该属性,需:
- 移除
XSINIL选项 - 用
ISNULL函数将NULL值转换为空字符串,确保每个字段都生成元素
假设 GRADUATE 表包含 ID, Name, Age, Major 字段,示例代码:
SELECT ISNULL(ID, '') AS ID, ISNULL(Name, '') AS Name, ISNULL(Age, '') AS Age, ISNULL(Major, '') AS Major FROM [GRADUATE] FOR XML PATH('applicant'), ROOT('applicantsuniversity'), ELEMENTS;
若要完全不生成NULL值对应的元素,直接移除 XSINIL 且不使用 ISNULL 即可。
合并两个需求的完整代码
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + CAST(( SELECT ISNULL(ID, '') AS ID, ISNULL(Name, '') AS Name, ISNULL(Age, '') AS Age, ISNULL(Major, '') AS Major FROM [GRADUATE] FOR XML PATH('applicant'), ROOT('applicantsuniversity'), ELEMENTS ) AS VARCHAR(MAX)) AS FinalXML;
内容的提问来源于stack exchange,提问作者SASPYTHON
相关产品推荐
相关产品推荐

