问题描述
我对 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++]
当我用 WinSCP 编辑器查看时,它看起来像这样 [WinSCP]
文件格式看起来像文本格式
我只是想看看这个 [notepad++ ok ]
当我打开的其他 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++ 代替内部编辑器?