【问题标题】:Generate XML in encoding UTF-8 using SQL Server使用 SQL Server 以编码 UTF-8 的方式生成 XML
【发布时间】:2017-02-13 04:48:34
【问题描述】:

我想生成一个 UTF-8 编码的 XML。但默认情况下它是在 UCS-2 中生成的。

请帮我生成 UTF-8 编码的 XML。以下是我的查询:

select
    isnull(cast('5678' as nvarchar(50)),'') [Vlootnummer],
    isnull((select top 1 cast(EngineNo as nvarchar(50)) 
            from VTS_DEMO.dbo.VehicleDetails v
            join VTS_DEMO.dbo.VehicleDevice vd on v.VehicleId = vd.VehicleId 
                                               and ObuID = '353234023894171'), '') as Kenteken,
    isnull((select top 1 cast(FillingStationName as nvarchar(50)) Units 
            from VTS_DEMO.dbo.FillingStation 
            where GeoFenceId = 3655),'') Locatie,
    isnull((select top 1 GeofenceCode 
            from VTS_DEMO.dbo.GeoFence 
            where GeoFenceId = 3655), '') GeoFencingID,
    isnull(cast(case when 1 = 0 then '' else '2017-02-07T23:15:25Z' end as nvarchar(50)),'') Aankomsttijd,
    isnull(cast(case when 1 = 0 then '2017-02-07T23:15:25Z' else NULL end as nvarchar(50)),'') Vertrektijd
FOR XML PATH('Notificatie')

当我使用存储过程 msdb.dbo.sp_send_dbmail 在邮件中将此 XML 作为附件发送时,当它在 notepad++ 中打开时,它会显示 UCS-2

【问题讨论】:

  • SQL Server(直到并包括 2016 版)不支持 UTF-8 ...

标签: sql-server


【解决方案1】:

根据MSDN documentation,这是对 MS SQL Server 上XML 数据类型的限制。 SQL Server 始终使用字符编码UCS-2 保存XML 数据类型。

在 xml 数据类型实例中存储 XML 数据时,不会保留 XML 声明 PI,例如 。这是设计使然。 XML 声明 () 及其属性(版本/编码/独立)在数据转换为 xml 类型后丢失。 XML 声明被视为对 XML 解析器的指令。 XML 数据在内部存储为 ucs-2。 XML 实例中的所有其他 PI 都将保留。

考虑到上述情况,您可以手动添加它以使其生效。 为了尝试做到这一点,您可以使用以下方法来利用FOR XML

SELECT CAST((SELECT [Columns] FROM [Tables] FOR XML AUTO) AS VARCHAR(MAX)) AS xmldata

您可以查看this 的答案以进行类似的讨论。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 2017-02-15
    • 2017-05-20
    • 2018-09-20
    • 2010-10-01
    • 2011-03-16
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多