BCP export to XML, opening XML gives error: Extra content at the end of the document

BCP export to XML, opening XML gives error: Extra content at the end of the document

我正在尝试使用 BCP 导出为 XML 格式,XML 文件已正确生成,但实际内容似乎有误。有人可以帮忙吗?

当我尝试在浏览器中打开 XML 时,我收到以下错误消息:

This page contains the following errors: error on line 1 at column 62: Extra content at the end of the document

我使用的SQLselect是:

DECLARE @fileName VARCHAR(50)
DECLARE @sqlStr VARCHAR(1000)
DECLARE @sqlCmd VARCHAR(1000)

SET @fileName = 'c:\fund_lib\test.xml'

USE PORT_APP_SQL

DROP TABLE ##temp;

WITH cte1
     AS (SELECT LTRIM(RTRIM(codigo))             AS code,
                CONVERT(VARCHAR(10), fecha, 120) AS date,
                precio                           AS NAV
         FROM   mpr_price_history
         WHERE  codigo IN( 'LU0038743380', 'LU0086913042', 'LU0265291665', 'LU0098860363',
                           'LU0128525689', 'LU0121204944', 'CZ0008474780', 'LU0363630376',
                           'LU0372180066', 'LU0271663857', 'LU0271663774', 'LU0363630707', 'LU0313643024' ))
SELECT *
INTO   ##temp
FROM   cte1

SET @sqlStr = 'select * from ##temp  order by code, date desc FOR XML RAW (''code'');'
-- Save XML records to a file:
SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName
              + ' -S "MPR01\SQLEXPRESS"  -T -w'

EXEC xp_cmdshell @sqlCmd  

这是我在 Firefox 中打开它时的错误消息(抱歉是西班牙语)。

error message seems to be at the end of each line

我有 运行 你的代码,稍作改动没有错误。
看来问题出在你的数据上。
寻找特殊的 XML 个字符。

原因是XML没有根路径。这个基于您的脚本的示例应该产生浏览器不会抱怨的 XML:

DECLARE @fileName VARCHAR(50);
DECLARE @sqlStr VARCHAR(1000);
DECLARE @sqlCmd VARCHAR(1000);

SET @fileName = 'c:\temp\test.xml';

SELECT *
INTO   ##temp
FROM   (VALUES('LU0038743380',GETDATE(),1),
              ('LU0086913042',GETDATE(),2),
              ('LU0265291665',GETDATE(),3),
              ('LU0098860363',GETDATE(),4)) AS cte1(fecha,[date],nav);

SET @sqlStr = 'select (select * from ##temp FOR XML RAW(''code''),TYPE) FOR XML PATH(''data'');'

-- Save XML records to a file:
SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout ' + @fileName
              + ' -S '+@@SERVERNAME+'  -T -w';

EXEC xp_cmdshell @sqlCmd;

DROP TABLE ##temp;

我认为您的整个查询都可以简化...不需要 CTE 或临时 table...

注意您的问题的解决方案是-可能! - 缺失的根节点,如 @TT. 所述。如果添加根节点可以解决您的问题,请不要接受我的回答(尽管您可能会投票赞成,如果您喜欢的话:-))。

您的问题可能与混合编码有关。如果您的输出包含特殊字符,当您混合使用 8 字节编码 (VARCHAR) 和带有选项 -w 的输出时,可能会出现一些问题。因此我把这一切都放在 NVARCHAR(MAX)

我的瘦身建议:

USE PORT_APP_SQL;

DECLARE @fileName NVARCHAR(50) = 'c:\fund_lib\test.xml';
DECLARE @cmd      NVARCHAR(MAX);

SET @cmd = 
N'SELECT LTRIM(RTRIM(codigo))             AS code
      ,CONVERT(VARCHAR(10), fecha, 120)   AS [date]
      ,precio                             AS NAV
FROM   mpr_price_history
WHERE  codigo IN( ''LU0038743380'', ''LU0086913042'', ''LU0265291665'', ''LU0098860363'',
                  ''LU0128525689'', ''LU0121204944'', ''CZ0008474780'', ''LU0363630376'',
                  ''LU0372180066'', ''LU0271663857'', ''LU0271663774'', ''LU0363630707'', ''LU0313643024'' )
ORDER BY code,[date] DESC
FOR XML RAW(''code''),ROOT(''root'');'

-- Save XML records to a file:
SET @cmd = N'bcp "' + @cmd + N'" queryout ' + @fileName
              + N' -S "MPR01\SQLEXPRESS"  -T -w'

EXEC xp_cmdshell @cmd;