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;
我正在尝试使用 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;