利用查詢編輯器來編輯 SQLCMD 指令碼

您可以使用 SQL Server Management Studio 中的 Database Engine 查詢編輯器,將查詢撰寫和編輯成 SQLCMD 指令碼。當您必須在相同的指令碼中處理 Windows 系統命令和 Transact-SQL 陳述式時,就可以使用 SQLCMD 指令碼。

SQLCMD 模式

若要使用 Database Engine 查詢編輯器來撰寫或編輯 SQLCMD 指令碼,您必須啟用 SQLCMD 指令碼模式。根據預設,查詢編輯器不會啟用 SQLCMD 模式。您可以按一下工具列上的 [SQLCMD 模式] 圖示,或從 [查詢] 功能表中選取 [SQLCMD 模式] 來啟用指令碼模式。

[!附註]

啟用 SQLCMD 模式就會關閉 Database Engine 查詢編輯器中的 IntelliSense 和 Transact-SQL 偵錯工具。

查詢編輯器中的 SQLCMD 指令碼可以使用所有 Transact-SQL 指令碼都使用的相同功能。這些功能包括:

  • 色彩編碼

  • 執行指令碼

  • 原始檔控制

  • 剖析指令碼

  • 執行程序表

在查詢編輯器中啟用 SQLCMD 指令碼

若要針對使用中 Database Engine 查詢編輯器視窗開啟 SQLCMD 指令碼,請使用下列程序。

將 Database Engine 查詢編輯器視窗切換到 SQLCMD 模式

  1. 在 [物件總管] 中,以滑鼠右鍵按一下伺服器,然後按一下 [新增查詢] 即可開啟新的 Database Engine 查詢編輯器視窗。

  2. [查詢] 功能表上,按一下 [SQLCMD 模式]

    此時 [查詢編輯器] 會在 [查詢編輯器] 的內容中執行 sqlcmd 陳述式。

  3. [SQL 編輯器] 工具列的 [可用的資料庫] 清單中,選取 AdventureWorks2008R2。

  4. 在 [查詢編輯器] 視窗中,輸入下列兩個 Transact-SQL 陳述式和 !!DIRsqlcmd 陳述式:

    SELECT DISTINCT Type FROM Sales.SpecialOffer;
    GO
    !!DIR
    GO
    SELECT ProductCategoryID, Name FROM Production.ProductCategory;
    GO
    
  5. 按 F5 來執行混合 Transact-SQL 和 MS-DOS 陳述式的整個區段。

    請注意第 1 個和第 3 個陳述式產生的兩個 SQL 結果窗格。

  6. [結果] 窗格中,按一下 [訊息] 索引標籤來查看這三個陳述式產生的訊息:

    • (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 命令,而不需在前面或後面加上 !!:

  • Database Engine 查詢編輯器支援環境變數和定義成 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 語法

Database Engine 查詢編輯器支援下列 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 關鍵字之指令碼時,查詢編輯器會傳送一則「忽略命令 <ignored command>」訊息給每個不支援的關鍵字之目的地。指令碼將順利執行,但會忽略不支援的命令。

警告注意事項注意

由於您不是從命令列啟動 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

請參閱

參考

概念