我有以下主脚本,它创建表,并插入一些数据,然后创建存储过程。
--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
答案 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'真的“相对”本身。)
所以你可以做的是:
:r
将该文本文件导入SSMS,并将该变量设置为所需路径!! 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