A)假设你有四个.sql文件(script1.sql,script2.sql,script3.sql,script4.sql ) in,比如说在一个文件夹c:\scripts中。
B)创建一个包含以下内容的主脚本文件(Main.sql),请注意,我已经给出了脚本的相对路径。
:r script1.sql
:r script2.sql
:r script3.sql
:r script4.sql将Main.sql保存在c:\scripts itself中。
C)创建一个名为"ExecuteScripts.bat“的批处理文件,其内容如下:-
SQLCMD -E -d<YourDatabaseName> -ic:\Scripts\Main.sql
PAUSE当我运行批处理文件时,它无法执行脚本1.sql文件。当我给出完整的路径C:\scripts\script1.sql时,它工作得很好,但我不想在这里硬编码路径。
使用sqlcmd可以实现这一点吗?
发布于 2015-07-20 02:15:18
@echo off
pushd "c:\scripts"
SQLCMD -E -d<YourDatabaseName> -iMain.sql
popd
PAUSE或者,如果所有sql脚本都与批处理脚本位于同一文件夹中,则:
@echo off
pushd "%~dp0"
SQLCMD -E -d<YourDatabaseName> -iMain.sql
popd
PAUSE最新版本允许您的脚本正常运行,无论它们驻留在何处。
发布于 2015-07-19 21:47:28
如果使用完整的路径,但动态创建文件Main.sql呢?
批处理文件,需要在批处理文件的文件夹中创建4个脚本文件,并在那里创建Main.sql。
@echo off
set "BatchFolder=%~dp0"
( echo :r %BatchFolder%script1.sql
echo :r %BatchFolder%script2.sql
echo :r %BatchFolder%script3.sql
echo :r %BatchFolder%script4.sql
)>"%BatchFolder%Main.sql"
sqlcmd.exe -E -d "YourDatabaseName" -i "%BatchFolder%Main.sql"
set "BatchFolder="
pause打开命令提示符窗口并在那里运行call /?。此命令的帮助将在解释%~dp0的窗口中输出,这意味着参数0的驱动器和路径以反斜杠结尾,不带引号。运行批处理文件时的参数0是批处理文件的名称。
在命令提示符窗口中运行set /?时,会显示命令set的帮助信息,并在上一个帮助页面中列出一些在运行批处理文件时动态定义的特殊环境变量。第一个列出的是%CD%,它表示当前目录。
因此,除了使用批处理文件文件夹之外,还可以在批处理执行时使用当前文件夹。
@echo off
set "CurrentFolder=%CD%\"
( echo :r %CurrentFolder%script1.sql
echo :r %CurrentFolder%script2.sql
echo :r %CurrentFolder%script3.sql
echo :r %CurrentFolder%script4.sql
)>"%CurrentFolder%Main.sql"
sqlcmd.exe -E -d "YourDatabaseName" -i "%CurrentFolder%Main.sql"
set "CurrentFolder="
pause%CD%引用的文件夹路径不像%~dp0返回的文件夹路径那样以反斜杠结尾,这是在第二行的%CD%之后使用反斜杠的原因。
https://stackoverflow.com/questions/31498316
复制相似问题