使用查詢編輯器編輯 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 模式

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

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

    查詢編輯器會在其本身的內容中執行 sqlcmd 陳述式。

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

  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 命令時不需要前置詞或在其之前加上 !!:

  • 資料庫引擎查詢編輯器支援環境變數以及定義為 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而言, stderrstdout 都會將輸出傳到訊息索引標籤。

查詢編輯器不支援上面所未列出的 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  

另請參閱

sqlcmd 公用程式