我与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变量做同样的事情。