必须声明标量变量@header

时间:2019-07-09 06:53:05

标签: sql-server xml bcp

我在使用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

错误在哪里?

感谢和问候

1 个答案:

答案 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变量进行相同操作即可。