首页 > 解决方案 > 如何使用 t-sql 编写包含声明的 xml 文件

问题描述

SQL Server 2017 Express - 我想将 xml 数据从数据库导出到文件something.xml。我可以查询数据并将数据写入文本文件。唯一缺少的是声明。

无论我做什么,声明都会立即删除,结果总是只有 XML 数据。从我所看到的情况来看,这个话题已经被说死了。但所有的答案都是几年前的。现在有没有机会从 T-SQL(没有 C#、没有 VB、没有 Javascript 等等)导出 XML 数据,包括 XML 声明行?

标签: sql-serverxmltsqlstored-procedures

解决方案


最重要的问题是:为什么需要声明?

重要提示:此声明不是 XML 的必要部分,而是提示消费者如何阅读内容。

在大多数情况下,这个声明告诉消费者一个文本文件的编码。那里有数以百万计的 XML 文件大喊大叫encoding="utf8"或类似的东西,但 - 事实上 - 文件是utf16纯 ASCII 或任何其他编码。如果声明没有说真话,最好不要有这样的声明……

在 SQL-Server 中,有三个存储 XML 的选项(这里不讨论binary或过时text): 最好是native XML,它在底层使用nvarchar基于层次结构的表,并且(一个不好的选择,但是)经常看到的是基于字符串的列两种字符串类型之一。您必须知道,SQL-Server 可以处理(var)char(x)(这是排序规则扩展的 ASCII)和 with n(var)char(x),这是UCS-2(几乎相同utf16)。

在这种情况下使用声明存储 XML 有什么好处?SQL-Server 可以直接从用于存储的类型中获取编码。在字符串级别上,您可以存储任何内容,甚至是无效/格式不正确的 XML。但是,在您输入本机XML 类型的那一刻,SQL-Server 将忽略任何声明并拒绝违反规则的 XML。

回答你的问题

如果确实需要,添加声明的唯一机会是将 XML 转换为字符串类型并在字符串级别添加声明。

请记住,

  • 您不能在不丢失声明的情况下将其带回本机 XML 。
  • 如果您声明任何编码,您应该确保写入的目标文件不是骗子。

几年前我有同样的问题(需要添加样式表提示)。您可能会阅读此相关问题(以及 har07 的一个很好的答案)。我自己的回答<?xml blahblah ?>具体反映了这一点。

最后的提示

v2019 开始,有utf-8一些特殊排序规则的原生支持,v2014SP2 开始,有对 BCP 的 UTF-8 支持

您可以使用此代码查找排序规则的编码:

select [name] 
      ,[description]
      ,COLLATIONPROPERTY([name],'codepage') [codepage]
from sys.fn_helpcollations();

并且 - 在此之后 - 你可能会使用这样的东西

<?xml version="1.0" encoding="windows-1252"?>

正确反映所选编码。

一般提示:在(几乎)任何情况下都NVARCHAR(MAX)使用字符串类型。utf-16


推荐阅读