使用查詢編輯器編輯 SQLCMD 指令碼

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

在 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 指令碼,請使用下列程序。

將資料庫引擎查詢編輯器視窗切換到 SQLCMD 模式

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

  2. 在 [查詢] 功能表上,選取 [SQLCMD 模式]。

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

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

  4. 在 [查詢編輯器] 視窗中,鍵入下列 Transact-SQL 陳述式和 !!DIR SQLCMD 陳述式:

    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:outstderrstdout,將輸出傳送到訊息索引標籤。

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

下一步