对 XML 输出的 SQL 查询出错格式就像文本文件

问题描述

我对 SQL 查询的 XML 输出有一个非常有趣的问题。

DECLARE @DateStr VARCHAR(30),@sql nvarchar (4000)
SET @DateStr = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(30),dateadd(HH,+2,getdate()),120),'.','-'),':',' ','_');
SET @sql ='bcp "SELECT top 1  [Kod],[Ad] FROM [SMFT].[dbo].[AlanKonya]  FOR XML PATH(''Cubik''),ROOT(''CubicDetails'')" queryout "\\\cgtserver\Development\Cubik_FIFOREPORT_' + @DateStr + '.xml" -T -S CGTSAPP\CGTSSQL120 -w -r -t'
EXEC xp_cmdshell @sql

输出文件看起来像这样。[notepad++]

1

当我用 WinSCP 编辑器查看时,它看起来像这样 [WinSCP]

2

文件格式看起来像文本格式

我只是想看看这个 [notepad++ ok ]

3

当我打开的其他 XML 文件看起来是格式化的时,为什么我的 XML 输出看起来像一个文本文件?

我无法使用 WinScp 传输文件,因为它显示为文本文件

我使用的是 SQL 2012 标准版。我在 SQL 2016 Enterprise 中尝试过,但结果相同

你能帮我吗?

最好的问候

这是我的新任务

DECLARE @FilePath VARCHAR(4000)DECLARE @SQLStr NVARCHAR(4000),@Cmd NVARCHAR(4000),@Ret INT,@DateStr VARCHAR(30),'_');
SELECT @SQLStr = 'SELECT N''<?xml version=''''1.0'''' encoding=''''UTF-8''''?>'' + (SELECT CAST((SELECT * FROM [SMFT].[dbo].Cubik_FIFOREPORT FOR XML  PATH(''Cubik''),ROOT(''CubicFifoReport''),ELEMENTS XSINIL) AS NVARCHAR(MAX)))'
SELECT @SQLStr AS SQLStr
SELECT @FilePath ='\\cgtserver\DEVELOPMENT\Cubik_FIFOREPORT_' + @DateStr + '.xml'
SELECT @Cmd = ' bcp " ' + @SQLStr + '" queryout '+@FilePath+'  -c -r  "" -T -S ' +@@ServerName
EXEC @Ret = master.dbo.xp_cmdshell @Cmd 

解决方法

您的输出文件采用带有 BOM 的 UTF-16 编码。 WinSCP 内部编辑器不支持 UTF-16,而 Notepad++ 支持。

如果您想使用 WinSCP 内部编辑器查看/编辑文件,请使用不同的编码导出文件。为此使用 bcp -C 开关。最好是使用 UTF-8 (65001),但它仅从 SQL Server 2016 开始受支持。在 2012 年,您将不得不求助于“ANSI/Microsoft”编码 (ACP),但这不是二进制安全的。见bcp documentation

queryout -C{65001} "path"

您是否知道可以configure WinSCP to edit files in Notepad++ 代替内部编辑器?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...