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

时间:2016-02-26 13:10:58

标签: sql-server xml character-encoding bcp

重现问题,SQL代码:

setState()

它创建包含以下内容的文件:

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;

Internet Explorer和Firefox不会将此类文件识别为有效的XML文件(Chrome会产生错误<BAR><Foo><SomeString>Degree symbol is °</SomeString></Foo></BAR> )。如果我用记事本打开它们并保存为Unicode(小端) - 它会打开并验证。

更新

  

error on line 1 at column 23: Encoding error选项更改为bcp似乎使XML对大多数XML使用者有效,但对Internet Explorer无效。

1 个答案:

答案 0 :(得分:2)

试试这个 -

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

您的问题的根源只是有趣......