2015-07-19 47 views
1

A)假設在文件夾c:\scripts中有4個.sql文件(script1.sql,script2.sql,script3.sql,script4.sql)。 B)用下面的代碼創建一個主腳本文件(Main.sql),請注意我給出了腳本的相對路徑。在sqlcmd模式下指定:r命令的相對路徑

: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 

當我運行的批處理文件,它無法script1.sql文件。當我給完整路徑C:\scripts\script1.sql,它工作正常,但我不想在這裏硬編碼路徑。

使用sqlcmd可以實現這個嗎?

回答

0

如何使用完整路徑,但動態創建文件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 /?結果在得到命令的幫助下設置顯示,最後幫助頁面上列出上運行的批處理文件定義的動態某些特殊的環境變量。列出的第一個是%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%在第二行之後用於反斜槓原因反斜槓結束。

2
@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 

的最後一個版本允許他們居住腳本運行正常,沒有關係。

+2

'pushd「%〜f0」'對我不起作用,但'pushd'%〜dp0''確實有效。 – Nathan

+0

@Nathan - 你絕對正確。這是我的一個馬虎的錯誤。謝謝。我通過編輯更正了答案。 – dbenham

0

您確定調用批處理的進程正在使用批處理位置作爲執行文件夾嗎?