xp_cmdshell仅适用于绝对文件路径?

时间:2013-05-29 05:08:11

标签: sql stored-procedures

我有一个sql代码如下:

SET @FILEE = '..\mydb.sql';
DECLARE @cmd NVARCHAR(1000);
SET @cmd = 'SQLCMD -S (local)\MYSQL -i' + @FILEE
exec xp_cmdshell @cmd;

这总是会出错:SqlCmd:'..\mydb.sql': invalid filename.

如果我输入类似:C:\mydb.sql的内容,它可以工作....但不适用于像上面这样引用的文件名。其中文件路径是参考当前文件的位置提到的。

有关如何解决此问题的任何指示?

如果没有,有没有办法引用vob位置?

2 个答案:

答案 0 :(得分:4)

正确指定

SQLCMD将使用相对文件路径 - 您遇到的问题是xp_cmdshell启动的工作目录不是您期望的目录。

您可以通过运行以下命令来查看起始目录:

xp_cmdshell 'cd'

默认情况下,我认为这通常是操作系统\system32目录(通常为C:\Windows\system32,但显然这可能会因Windows安装的详细信息而异)

您的解决方法是指定绝对路径(如您已发现的那样)或使用CD命令切换到您要使用的相对路径正确的其他工作目录。

答案 1 :(得分:0)

复活旧线程,希望它可以对像我这样的人有所帮助。我在执行脚本时遇到问题,该脚本又通过相对路径引用了其他脚本。

可以在CMD中链接命令。

假设您知道需要从哪个文件夹开始(例如C:\ myscripts),则如下所示:

DECLARE @sql NVARCHAR(1000)
SELECT @sql = 'cd C:\myscripts && sqlcmd -S ' + @@SERVERNAME + ' -d ' + DB_NAME() + ' -i myscript.sql'
EXEC xp_cmdshell @sql