我在使用bcp创建xml文件时遇到问题。
如果我执行单个查询
SELECT @header, @inland
FOR XML RAW(''), ROOT('root'), ELEMENTS, TYPE
我收到了正确的XML数据。
但是如果我将查询插入到exec master..xp_cmdshell
declare @cmd varchar(2000) = 'bcp "SELECT @header,@inland FOR XML RAW(''''),ROOT(''root''), ELEMENTS, TYPE" queryout "\\server01\TEMP_SW\XML_TMS\test_'+@num+'.xml" -U xx -P xxxxx -c -C ANSI -t;' ;
exec master..xp_cmdshell @cmd;
系统返回错误
SQLState = 37000,NativeError = 137
错误= [Microsoft] [SQL Native Client] [SQL Server]必须声明标量变量“ @header”。SQLState = 37000,NativeError = 8180
错误= [Microsoft] [SQL本机客户端] [SQL Server]语句无法准备。
@header
被声明为XML
错误在哪里?
感谢和问候
答案 0 :(得分:0)
该错误正是所报告的。使用BCP的QUERYOUT选项时,您将获得一个新的单独的SQL连接,在其中执行SQL语句(实际上是xp_cmdshell首先打开一个新的OS线程……然后bcp-queryout打开一个新的SQL连接)。该语句对您在xp_cmdshell命令之前可能已执行的任何较早的“声明”或“设置/选择”语句一无所知。因此,将您的SQL语句视为独立查询,当然会得到一个错误,指出您的变量尚未定义。
要做您想做的事情,您能否在构建@cmd字符串时解析变量的值?像这样:
declare @cmd varchar(2000)
select @cmd = 'bcp "SELECT ' + @header + ',' + @inland + ' FOR XML RAW(''''),ROOT(''root''), ELEMENTS, TYPE" queryout "\\server01\TEMP_SW\XML_TMS\test_'+@num+'.xml" -U xx -P xxxxx -c -C ANSI -t;' ;
exec master..xp_cmdshell @cmd;
您似乎很乐意使用稍后添加到字符串中的@num变量来执行此操作。只需对您的@header和@inland变量进行相同操作即可。