0

我对 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 企业版中尝试过,但结果相同

请问你能帮帮我吗?

此致

这是我的新问题

DECLARE @FilePath VARCHAR(4000)DECLARE @SQLStr NVARCHAR(4000),
    @Cmd NVARCHAR(4000),
    @Ret INT,
    @DateStr VARCHAR(30), @sql nvarchar (4000)
SET @DateStr = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(30), dateadd(HH,+2,getdate()),120),'.','-'),':','-'),' ','_');
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 
4

1 回答 1

0

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

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

queryout -C{65001} "path"

您是否知道可以将 WinSCP 配置为在 Notepad++ 中编辑文件而不是内部编辑器?

于 2021-01-06T08:21:51.567 回答