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
我在从 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