从SQL Server 2016中导出UTF-8编码的XML文件(不带BOM)。

3
如您所知,微软终于在其 SQL Server 2016 中支持 UTF-8。我想知道如何从一个没有 BOM 的存储过程中创建一个 UTF-8 编码的 XML 文件。
在 SQL Server 2016 的技术概述中,它说:
“支持导入和导出 UTF-8 数据。现在可以使用 BULK INSERT T-SQL 命令和 bcp 命令行实用程序将存储在 UTF-8 编码文件中的数据导入到 SQL Server 中,并从 SQL Server 导出到 UTF-8 编码文件中。作为导入过程的一部分,从文件中读取 UTF-8 编码字符串,并将其转换并存储为与 SQL Server 表中目标列对应的本地数据类型。作为导出过程的一部分,将数据从本地数据类型转换为 UTF-8 编码字符串,并写入文件。除了 Xml、SqlVariant、Text、NText 和 Image 外,所有本地数据类型都受支持。”
据我理解,我现在可以使用以下命令创建一个 UTF-8 文件:
declare @command varchar(8000)

set @command = 'bcp "select * from Table" queryout 
"{path}"  -T -t; -c -C65001'

exec xp_cmdshell @command

但我不知道如何从“FOR XML”查询中创建文件。而且我也不知道生成的文件是否带有BOM。

在谷歌上搜寻了半个小时后,我找不到任何答案,所以现在想在这里找到一个答案。

谢谢!


1
你为什么想要干扰其他试图读取文件的应用程序呢?无论如何,bcp并不是一个导出工具。管理员通常会从命令行中使用它。在存储过程内调用它是一个严重的问题,因为它需要提升权限。只需使用适当的工具来完成这项工作 - SSIS。 - Panagiotis Kanavos
更糟糕的是,它不仅需要提升权限,而且非常古老。为什么不使用适当的工具呢?没有文档或文章提到BULK INSERT或BCP用于此目的。所有都提到了导出向导,这是SSIS的前端。 SSIS在文档中有一个完整的部分。你想做什么??? - Panagiotis Kanavos
我有一个存储过程,应该能够从“FOR XML”查询中将XML文件导出到文件系统中。此文件应为UTF-8格式,不带BOM。这是一个SQL Server代理作业,每天会从某些表格创建XML文件。然后,批处理文件会将XML文件发送到FTP服务器,供其他机构使用。 - Caspar
我没有尝试过,但我希望SQL Server不使用UTF-8的BOM。UTF-8是一种逐字节编码,因此不会出现字节顺序问题。BOM仅适用于UTF-16和UTF-32,这是双字(2字节)和四字(4字节)编码。 - Codo
我目前正在从SQL Server 2008导出XML文件(将XML变量转换为.xml文件),而记事本++中所列的结果文件编码为“utf-8 bom”。我来这里是想找出如何删除bom,因为我同意...在utf-8上有它是没有意义的。 - High Plains Grifter
显示剩余2条评论
1个回答

1

我想自己编写一个小工具...

以下内容中我会用 C#,但大多数高级编程语言都适用:

  • C# 可以调用返回 XML 的查询 (SELECT ... FOR XML ...),没有任何问题
  • 在 C# 中,来自 SQL Server 的 xml 被映射为字符串。
  • C# 能够将此字符串转换为您需要的任何格式
  • C# 可以将其写入它被允许写入的任何位置
  • C# 可以按计时器驱动执行此操作,或者您可以使用作业

SQL Server 在写入文件系统方面非常有限。当然,您可以使用 SSIS...

如果您在 .Net 中完成此操作,甚至可以将其包含为程序集并使用 T-SQL 语句调用它。


这听起来真的很不错。但是我听说在迁移到新的 SQL Server 版本时会出现兼容性问题。这真的是这么大的问题吗? - Caspar
说实话,我不会将其集成为汇编语言,而是部署为一个辅助工具。这样可以拥有特定于客户的配置(XML 文件?),并且将在用户上下文中工作,同时文件系统权限 SQL-Server 中绑定到 SQL-Server 用户和运行服务器的计算机。 - Shnugo
1
我可能会将一个汇编集成到SQL Server中,因为我希望大部分逻辑都在存储过程中。我只会将文件写入部分封装到一个汇编中,并从我的存储过程中调用它。不管怎样,感谢您的回答。它帮了我很多。 - Caspar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接