【问题标题】:how to write a xml file including declaration with t-sql如何使用 t-sql 编写包含声明的 xml 文件
【发布时间】:2020-03-01 09:47:55
【问题描述】:

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

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

【问题讨论】:

  • 向我们展示您的代码,向我们展示您的尝试。你得到的结果有什么问题;解释为什么你得到的结果是错误的,并向我们展示问题所在。你说你见过这是“谈死”;在哪里?您尝试实施了哪些答案,为什么没有奏效?
  • 我的代码全部来自网络:google.de/… 我几乎尝试了所有方法 - 但最近没有一篇文章或线程写过。没有答案确实有效,它总是相同的结果。 xml数据写入文件,声明没有。我需要声明和 xml-data

标签: sql-server xml tsql stored-procedures


【解决方案1】:

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

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

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

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

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

回答你的问题

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

请记住

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

几年前我也有同样的问题(需要添加样式表提示)。 你可能会读到这个related question (and a good answer by har07)。我自己的回答具体反映了<?xml blahblah ?>

最后的提示

开始 with v2019 there is native utf-8 support with some special collationsstarting with v2014SP2 there was UTF-8 support for BCP

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

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

然后 - 在此之后 - 你可能会使用类似这样的东西

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

正确反映所选编码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2017-01-08
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2022-01-09
    • 2018-05-12
    相关资源
    最近更新 更多