使用BCP创建XML文件会产生非ASCII字符无效编码的文件

4

问题复现,SQL 代码:

CREATE TABLE dbo.FooTable(SomeString NVARCHAR(100));
INSERT INTO dbo.FooTable(SomeString)
VALUES('Degree symbol is °');
DECLARE @Code NVARCHAR(4000) = N'BCP "SELECT (SELECT SomeString FROM dbo.FooTable FOR XML PATH(''Foo''), ROOT(''BAR''), TYPE )"  QUERYOUT "F:\Output\File.XML" -c -C RAW -T ';

EXEC xp_cmdshell @Code;

DROP TABLE dbo.FooTable;

它会创建一个包含以下内容的文件:
<BAR><Foo><SomeString>Degree symbol is °</SomeString></Foo></BAR>

这些文件在Internet Explorer和Firefox中不被识别为有效的XML文件(Chrome会产生错误error on line 1 at column 23: Encoding error)。如果我使用记事本打开并以Unicode(小端)保存,它就可以打开和验证。
更新:
将选项更改为-T -w -r -t似乎可以使XML对大多数XML消费者有效,但不能用于Internet Explorer。
1个回答

3

试试这个 -

IF OBJECT_ID('tempdb.dbo.##t') IS NOT NULL
    DROP TABLE ##t

SELECT x = (
    SELECT x
    FROM (
        VALUES (N'Degree symbol is °')
    ) t(x)
    FOR XML PATH('Foo'), ROOT('BAR'), TYPE
)
INTO ##t

DECLARE @sql NVARCHAR(4000) = 'bcp "SELECT * FROM ##t" queryout "D:\sample.xml" -S ' + @@servername + ' -T -w -r -t'
EXEC sys.xp_cmdshell @sql

很有趣,想知道你的问题根源在哪里...


这是一个问题——这个文件可以在Firefox中打开,但在IE中无法打开,而且包含大量空格。 - Ginden
好的 - 将 bcp 选项更改为 -T -w -r -t 看起来可以解决大多数 XML 消费者的问题,但不适用于 Internet Explorer... - Ginden

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