我正在尝试使用BCP导出为XML格式,并且XML文件生成正确,但实际内容似乎有误。有人可以帮忙吗?
当我尝试在浏览器中打开XML时,我收到以下错误消息:
此页面包含以下错误:第62行第1行的错误: 文档末尾的额外内容
我正在使用的SQL选择是:
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中打开它,这是错误消息(抱歉是西班牙语)。
答案 0 :(得分:2)
原因是因为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;
答案 1 :(得分:2)
我认为你的整个查询可以简化......不需要CTE或临时表......
关注您的问题的解决方案是 - 可能! - Error: unexpected '{' in "g + labs( y=expression(N_{"
Execution halted
提到的缺少的根节点。如果添加根节点解决了您的问题,请不要接受我的回答(尽管您可以投票,如果您喜欢:-))。
您的问题可能会受到各种编码的影响。如果输出包含特殊字符,则混合使用8字节编码(@TT.
)和输出选项VARCHAR
时可能会出现问题。因此,我把这一切都放在-w
我建议让事情变得苗条:
NVARCHAR(MAX)
答案 2 :(得分:0)
我在没有错误的情况下进行了小规模的改动 似乎问题出在您的数据上 寻找特殊的XML字符。