如何在SSMS中获取SQLCMD模式下文件的相对路径?

Ani*_*esh 15 sql-server ssms sqlcmd

我有下面的主脚本,它创建表,并插入一些数据,然后创建存储过程.

--todo_master.sql

use master
go

:r todo_create_ddl.sql
:r todo_create_dml.sql
:r todo_create_sprocs.sql
go
Run Code Online (Sandbox Code Playgroud)

但是,即使todo_master.sql与其他三个脚本位于相同的路径中,也无法找到这三个脚本.

我收到以下错误:

A fatal scripting error occurred.
The file specified for :r command was not found.
Run Code Online (Sandbox Code Playgroud)

如果我提供如下所示的完整路径,则会按预期找到并执行这些文件.

"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"

我可能会失踪什么?


编辑 正如杰森所建议我试过这个,但仍然得到同样的错误:

use master
go

:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects"
:setvar ddl "todo_create_ddl.sql"
:setvar dml "todo_create_dml.sql"
:setvar sprocs "todo_create_sprocs.sql"

:r $(path)$(ddl)
:r $(path)$(dml)
:r $(path)$(sprocs)
go
Run Code Online (Sandbox Code Playgroud)

Jas*_*and 26

您可以使用sqlcmd setvar选项为变量分配路径来解决此问题.然后在您的:r调用中使用该变量,如:

:setvar path "c:\some path"
:r $(path)\myfile.sql
Run Code Online (Sandbox Code Playgroud)

此链接有一个更深入的示例:http: //www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

有了这个,你可以删除setvar行并从命令行传入它:

Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath
Run Code Online (Sandbox Code Playgroud)

这可以解决脚本没有从调用第一个SQL脚本的目录运行的问题.

  • 到目前为止我想到的是在文件夹路径中有空格不起作用.我尝试使用没有空格的文件夹路径,发现它确实有效. (2认同)
  • 所有这一切都是创建一个绝对执行路径,这不是原始问题所要求的。在需要相对路径的情况下,例如持续集成、持续交付等,这不是一个可行的解决方案,这种方法需要针对不同环境编辑文件或针对不同环境使用唯一的 powershell 参数调用脚本。 (2认同)

小智 5

我意识到这已经很老了,但我注意到你编辑的代码中有一个错误:你需要在路径和脚本名称之间加一个反斜杠.

:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
Run Code Online (Sandbox Code Playgroud)