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

时间:2012-01-06 04:54:28

标签: 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

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

我收到以下错误:

A fatal scripting error occurred.
The file specified for :r command was not found.

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

"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

6 个答案:

答案 0 :(得分:25)

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

:setvar path "c:\some path"
:r $(path)\myfile.sql

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

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

Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath

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

答案 1 :(得分:5)

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

:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)

答案 2 :(得分:4)

我发现,这将是最好的:

:setvar path C:\"some path"

:r $(path)\myfile.sql

您必须将带空格的语句放在引号中,而不是整个语句。这就是你可以做C:\"some path"

的原因

答案 3 :(得分:3)

在SSMS中获取相对路径并不是那么简单,因为您没有执行脚本; SSMS已将脚本加载到内存中并正在执行其文本。因此,当前目录/文件夹是默认的进程启动文件夹。您可以通过在SSMS中以SQLCMD模式运行以下内容来查看此内容:

!! PWD

然而,我确实找到了一种有点方法来做到这一点。我承认这不是最理想的方式,但是,它目前似乎是获得 true 相对路径的唯一方法(假设在变量中设置路径是'n'真的“相对”本身。)

所以你可以做的是:

  1. 执行DOS命令以查找 todo_master.sql ,并将该文件的路径存储在可从SSMS获取的文件夹中的文本文件中,因为它是硬编码路径或因为它使用的是可用于DOS命令和SSMS中的SQLCMD模式的环境变量
  2. 在该文件中存储路径时,将其存储为SQLCMD模式命令,将变量设置为该路径
  3. 使用:r将该文本文件导入SSMS,并将该变量设置为所需路径
  4. !! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S todo_master.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt
    
    :r $(TEMP)\relative_path.txt
    
    :r $(mypath)\todo_create_ddl.sql
    GO
    :r $(mypath)\todo_create_dml.sql
    GO
    :r $(mypath)\todo_create_sprocs.sql
    GO
    

    注意:

    • 上述方法假设系统中只有一个文件名为 todo_master.sql 。如果多个文件具有该名称,则找到的最后一个文件将是 relative_path.txt 文件中设置的路径

    • 执行CD C:\将从 C:驱动器的根目录开始。这可能不是最有效的起点。如果您通常在 C:\ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects 等区域中拥有SQL文件,则只需更改CD命令即可​​更接近目的地,例如:

      !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...
      

答案 4 :(得分:0)

我自己也有同样的问题,我希望我没有说明显而易见的事实 - 为什么不在包含脚本的目录中打开Dos / Cmd或PowerShell实例cd,然后从那里加载Management Studio?

我在PowerShell设置中有这个别名(你的路径可能不同):

Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe" 

我然后cd到包含解决方案文件的文件夹,然后我

Ssms mysolution.ssmssln

答案 5 :(得分:0)

使用批处理文件作为帮助程序。

修改todo_master.sql以使用名为mypath的环境变量:

use master
go 
:r $(mypath)\todo_create_ddl.sql
:r $(mypath)\todo_create_dml.sql
:r $(mypath)\todo_create_sprocs.sql
go

在您的批处理文件todo_master.bat

/* set the environment variable to the current directory */
SET mypath=%cd%
/* run your sql command */
sqlcmd -i todo_master.sql