SQL - 创建 XML - 如何设置 Unicode UTF-8

SQL - Create XML - How to set Unicode UTF-8

我在从 SQL 过程中创建 XML 文件时遇到问题。 XMLs 被创建并放置在正确的文件夹中。虽然当我在 XMLSpy 中打开文件时,它显示以下错误:

Your file contains 3 character(s) that should not be present in a file using the Unicode UTF-8 encoding... The offending characters are è (0xE8), ü (0xFC), é (0xE9)

当我在 Notepad++ 中打开 XML 文件并检查编码(通过顶部的菜单编码)时,它说它是 ANSI 而不是 UTF-8。

所以我的问题是:如何让它变成 UTF-8?有什么建议么? 我的程序代码可以在下面找到:

@File        VARCHAR(2000) // parameter
AS 

BEGIN 
DECLARE @OLE            INT 
DECLARE @FileID         INT 

EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT 

EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, @File, 8, 1 

DECLARE @Text XML
SET @Text = (SELECT TOP(1) [xml] from VW_WARP_LEVERANCIERS_XML)     

EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, @Text

EXECUTE sp_OADestroy @FileID 
EXECUTE sp_OADestroy @OLE 

END

编辑 1

更改了我的代码,导出为 ASCII 而不是 Unicode(如下面 Wolf 所建议),但这也无济于事。但这是那部分代码:

DECLARE @OLE            INT 
DECLARE @FileID         INT

EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT 

EXECUTE sp_OAMethod @OLE, 'CreateTextFile', @FileID  OUT, @File, 2, False

DECLARE @Text XML
SET @Text = (SELECT TOP(1) [xml] from VW_WARP_LEVERANCIERS_XML)     

EXECUTE sp_OAMethod  @FileID , 'Write', Null, @Text
EXECUTE sp_OAMethod  @FileID , 'Close'


EXECUTE sp_OADestroy @FileID 
EXECUTE sp_OADestroy @OLE 

END 

一般来说,SQL服务器本身不支持UTF-8。但是,我不确定 FSO,也许是。

OpenTextFile 文档指出您可以确定文件格式,即 ASCII 或 Unicode。尝试:

EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, @File, 8, 0;

这应该会给你一个 ASCII 文件格式。

我通过其他方式找到了解决方案。 (不记得是在哪个网站找到的) 请参阅下面的代码。此代码将以 UTF-8-BOM 编码导出我的文件。

@File        VARCHAR(2000)
AS 

BEGIN 

DECLARE @OLE            INT 

EXECUTE sp_OACreate 'ADODB.Stream',  @OLE OUTPUT

DECLARE @Text XML
SET @Text = (SELECT TOP(1) [xml] from VW_WARP_LEVERANCIERS_XML)     
DECLARE @Converted NVARCHAR(MAX)
SET @Converted = CONVERT(nvarchar(MAX), @Text)

EXECUTE sp_OASetProperty             @OLE,    'Type',             2                           --1 = binary, 2 = text
EXECUTE sp_OASetProperty             @OLE,    'Mode',             3                           --0 = not set, 1 read, 2 write, 3 read/write
EXECUTE sp_OASetProperty             @OLE,    'Charset',          'UTF-8'                     --'ISO-8859-1'
EXECUTE sp_OASetProperty             @OLE,    'LineSeparator',    'adLF'
EXECUTE sp_OAMethod                  @OLE,    'Open'  
EXECUTE sp_OAMethod                  @OLE,    'WriteText',        NULL,       @Converted      --text method

--Commit data and close text stream
EXECUTE sp_OAMethod                  @OLE,    'SaveToFile',       NULL,       @File, 2   --1 = notexist 2 = overwrite
EXECUTE sp_OAMethod                  @OLE,    'Close'
EXECUTE sp_OADestroy                 @OLE

EXECUTE sp_OADestroy @OLE 

END