sql-server - 如何使用 t-sql 编写包含声明的 xml 文件
问题描述
SQL Server 2017 Express - 我想将 xml 数据从数据库导出到文件something.xml
。我可以查询数据并将数据写入文本文件。唯一缺少的是声明。
无论我做什么,声明都会立即删除,结果总是只有 XML 数据。从我所看到的情况来看,这个话题已经被说死了。但所有的答案都是几年前的。现在有没有机会从 T-SQL(没有 C#、没有 VB、没有 Javascript 等等)导出 XML 数据,包括 XML 声明行?
解决方案
最重要的问题是:为什么需要声明?
重要提示:此声明不是 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
推荐阅读
- sql - 使用 Presto 获取错误响应 HTTP 403?
- postgresql - PostgreSQL 移动/网络用户百分比
- git - 无法访问“https://github.com/Homebrew/brew/”:LibreSSL SSL_connect
- python - 如何相对于质心径向填充 matplotlib 文本对象?(Python)
- python - 如何在我的程序中解决这个错误?
- bootstrap-4 - 数据表和 bootstrap4 - 数据表解决了网格问题
- python - 是否可以从新模块中公开已加载模块的所有属性?
- python - 生成一个后台进程并阻塞等待它完成
- c# - 在 ASP.NET Core 中优雅地中止 SSE 请求
- oracle - sql developer version 20.4 ssh ui 无字段