我错过了什么

时间:2010-04-07 11:23:36

标签: sql-server xp-cmdshell

declare @servername varchar(2000)
set @EmriServerit=(select @@servername)
declare @dbname varchar(2000)
set @dbname ='Test1'
declare @Dir varchar(2000)
set @Dir='F:\dataclient.sql'

exec master.dbo.xp_cmdshell 'osql -E -S ' + @servername+ ' -d ' + 
    @dbname +' -i ' + @Dir

它给了我一个错误: “语法不正确+”

如果我不使用变量,它可以正常工作。 我错过了什么! 提前致谢

5 个答案:

答案 0 :(得分:3)

参数列表中不允许添加。将它们移动到单独的行,例如:

declare @cmd varchar(500)
set @cmd = 'osql -E -S ' + @servername+ ' -d ' + @dbname +' -i ' + @Dir
exec master.dbo.xp_cmdshell @cmd

答案 1 :(得分:2)

您没有为@servername

指定值

答案 2 :(得分:2)

我会首先尝试将命令字符串连接在一起,然后在执行之前检查它:

declare @servername varchar(2000)
set @servername = select @@servername

declare @dbname varchar(2000)
set @dbname ='Test1'

declare @Dir varchar(2000)
set @Dir='F:\dataclient.sql'

declare @execCmd varchar(max)
set @execCmd = 'osql -E -S ' + @servername+ ' -d ' + @dbname +' -i ' + @Dir

print @execCmd  -- what do you get as output here??

exec master.dbo.xp_cmdshell @execCmd

答案 3 :(得分:0)

尝试将整个exec放在一条线上(我承认,这在黑暗中有点刺伤)。

答案 4 :(得分:0)

尝试:

declare @EmriServerit varchar(2000)
set @EmriServerit=(select @@servername)
declare @dbname varchar(2000)
set @dbname ='Test1'
declare @Dir varchar(2000)
set @Dir='F:\dataclient.sql'
declare @Command varchar(500)

set @command='osql -E -S ' + @EmriServerit+ ' -d ' + 
    @dbname +' -i ' + @Dir
exec master.dbo.xp_cmdshell @command

您声明并使用了不同的服务器名称,并且不允许将表达式作为存储过程的参数,因此将命令连接到变量中,然后将其传递给master.dbo.xp_cmdshell存储过程。 / p>