必须声明标量变量@header



我与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 "\server01TEMP_SWXML_TMStest_'+@num+'.xml" -U xx -P xxxxx -c -C ANSI -t;' ;
exec master..xp_cmdshell @cmd;

系统返回错误

sqlstate = 37000,本机= 137
错误= [Microsoft] [SQL本地客户端] [SQL Server]必须声明标量变量" @header"。

sqlstate = 37000,本机= 8180
错误= [Microsoft] [SQL本地客户端] [SQL Server]无法准备语句。

@header被声明为xml

错误在哪里?

谢谢,问候

错误只是报告的内容。当使用BCP的查询选项时,您将获得一个新的单独的SQL连接,在该连接中执行了SQL语句(实际上是XP_CMDShell首先打开一个新的OS线程...然后BCP-QueryOut打开新的SQL连接(。此语句对您在XP_CMDSHELL命令之前可能执行的任何较早的"声明"或" SET/SELECT"语句一无所知。因此,将您的SQL语句视为独立查询,当然,您会发现尚未定义变量的错误。

要做您要尝试的事情,您可以在buid buiding @cmd字符串时解决变量的值吗?这样:

declare @cmd varchar(2000)
select @cmd = 'bcp "SELECT ' + @header + ',' + @inland + ' FOR XML RAW(''''),ROOT(''root''), ELEMENTS, TYPE" queryout "\server01TEMP_SWXML_TMStest_'+@num+'.xml" -U xx -P xxxxx -c -C ANSI -t;' ;
exec master..xp_cmdshell @cmd;

看起来您正在使用@num变量添加到字符串中的@num变量。只需对您的@header和@inland变量做同样的事情。

最新更新