使用查詢編輯器編輯 SQLCMD 指令碼
在 SQL Server Management Studio 中使用資料庫引擎查詢編輯器,即可撰寫和編輯查詢作為 SQLCMD 指令碼。 當必須在相同指令碼中處理 Windows 系統命令和 Transact-SQL 陳述式時,即可使用 SQLCMD 指令碼。
SQLCMD 模式
若要使用資料庫引擎查詢編輯器來撰寫或編輯 SQLCMD 指令碼,您必須啟用 SQLCMD 指令碼模式。 根據預設,查詢編輯器不會啟用 SQLCMD 模式。 您可以按一下工具列上的 SQLCMD 模式圖示,或從 [查詢] 功能表中選取 [SQLCMD 模式]啟用指令碼模式。
注意
啟用 SQLCMD 模式就會關閉資料庫引擎查詢編輯器中的 IntelliSense 和 Transact-SQL 偵錯工具。
查詢編輯器中的 SQLCMD 指令碼可以使用所有 Transact-SQL 指令碼都使用的相同功能。 這些功能包括:
色彩編碼
執行指令碼
原始程式碼控制
剖析指令碼
Showplan
在查詢編輯器中啟用 SQLCMD 指令碼
若要針對使用中資料庫引擎查詢編輯器視窗開啟 SQLCMD 指令碼,請使用下列程序。
將 Database Engine 查詢編輯器視窗切換到 SQLCMD 模式
在物件總管中,以滑鼠右鍵按一下伺服器,然後按一下 [新增查詢],以開啟新的 [資料庫引擎查詢編輯器] 視窗。
在 [查詢] 功能表上,按一下 [SQLCMD 模式]。
查詢編輯器會在其本身的內容中執行 sqlcmd 陳述式。
在 [SQL 編輯器] 工具列的 [可用的資料庫] 清單中,選取 [AdventureWorks2012]。
在 [查詢編輯器] 視窗中,輸入下列兩個 Transact-SQL 語句和
!!DIR
sqlcmd 語句:SELECT DISTINCT Type FROM Sales.SpecialOffer; GO !!DIR GO SELECT ProductCategoryID, Name FROM Production.ProductCategory; GO
按 F5 以執行混合 Transact-SQL 與 MS-DOS 陳述式的整個區段。
請注意第 1 個和第 3 個陳述式產生的兩個 SQL 結果窗格。
在 [結果] 窗格中,按一下 [訊息] 索引標籤來查看這三個陳述式產生的訊息:
(6 個資料列受影響)
<目錄資訊>
(4 個資料列受影響)
重要
從命令列執行時, sqlcmd 公用程式允許與作業系統進行完整互動。 當您在 [SQLCMD 模式] 中使用 [查詢編輯器] 時,您必須非常小心,不要執行互動式陳述式。 [查詢編輯器] 無法回應作業系統提示。
如需有關如何執行 SQLCMD 的詳細資訊,請參閱 sqlcmd 工用程式,或進入 SQLCMD 教學課程。
依預設,會啟用 SQLCMD 指令碼
若要依預設開啟 SQLCMD 指令碼,請在 [工具] 功能表中選取 [選項],展開 [執行查詢] 和 SQL Server,按一下 [一般] 頁面,再核取 [預設會以 SQLCMD 模式開啟新查詢] 方塊。
撰寫和編輯 SQLCMD 指令碼
在啟用指令碼模式之後,您可以撰寫 SQLCMD 命令和 Transact-SQL 陳述式。 適用的規則如下:
SQLCMD 命令必須是行中的第一個陳述式。
每行只能有一個 SQLCMD 命令。
SQLCMD 命令前面可以有註解或空格。
不會執行註解字元內的 SQLCMD 命令。
單行註解字元是兩個連字號 (
--)
,必須在行首。作業系統命令的前面必須有兩個驚歎號 (
!!
)。 兩個驚歎號的命令會使在驚歎號後面的陳述式利用cmd.exe
命令處理器來執行。!!
之後的文字會當做參數傳給cmd.exe
,因此,最後執行的命令列是:"%SystemRoot%\system32\cmd.exe /c <text after !!>"
。為了清楚區分 SQLCMD 命令與 Transact-SQL,所有 SQLCMD 命令的前面都需要加上冒號 (
:
)。使用
GO
命令時不需要前置詞或在其之前加上!!:
資料庫引擎查詢編輯器支援環境變數以及定義為 SQLCMD 指令碼一部分的變數,但不支援內建 SQLCMD 或 osql 變數。 SQL Server Management Studio 的 SQLCMD 處理會區分變數的大小寫。 例如,PRINT '$(COMPUTERNAME)' 會產生正確的結果,但是 PRINT '$(ComputerName)' 會傳回錯誤。
警告
SQL Server Management Studio 會使用 Microsoft.NET FrameworkSqlClient,以一般和 SQLCMD 模式執行。 從命令列執行時,SQLCMD 會使用 OLE DB 提供者。 因為可能套用不同的預設選項,所以在 SQL Server Management Studio SQLCMD 模式中以及在 SQLCMD 公用程式中執行相同的查詢時,可能會出現不同的行為。
支援的 SQLCMD 語法
資料庫引擎查詢編輯器支援下列 SQLCMD 指令碼關鍵字:
[!!:]GO[count]
!! <command>
:exit(statement)
:Quit
:r <filename>
:setvar <var> <value>
:connect server[\instance] [-l login_timeout] [-U user [-P password]]
:on error [ignore|exit]
:error <filename>|stderr|stdout
:out <filename>|stderr|stdout
注意
對於 :error
和 :out
而言, stderr
和 stdout
都會將輸出傳到訊息索引標籤。
查詢編輯器不支援上面所未列出的 SQLCMD 命令。 執行包含不受支援 SQLCMD 關鍵字的指令碼時,查詢編輯器會將一則「忽略命令 <忽略的命令>」訊息傳送給每個不受支援關鍵字的目的地。 指令碼將順利執行,但會忽略不支援的命令。
警告
由於您不是從命令列啟動 SQLCMD,因此,當執行查詢編輯器的 SQLCMD 模式時,會有若干限制。 您不能傳入變數之類的命令列參數,且因為查詢編輯器沒有回應作業系統提示的能力,您必須小心避免執行互動式的陳述式。
SQLCMD 指令碼中的色彩編碼
在啟用 SQLCMD 指令碼之後,指令碼會有色彩編碼。 Transact-SQL 關鍵字的色彩編碼維持不變。 SQLCMD 命令會呈現陰影效果的背景。
範例
下列範例使用 sqlcmd 陳述式來建立稱為 testoutput.txt 的輸出檔案、執行兩個 Transact-SQL SELECT 陳述式,以及一個作業系統命令 (印出目前的目錄)。 產生的檔案包含 DIR
陳述式的訊息輸出,且後面會有 Transact-SQL 陳述式的結果輸出。
:out C:\testoutput.txt
SELECT @@VERSION As 'Server Version'
!!DIR
!!:GO
SELECT @@SERVERNAME AS 'Server Name'
GO