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

適用于:SQL Server (Azure SQL Database Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System ( PDW) 的所有支援) 版本

藉由在 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 腳本所使用的相同功能。 這些功能包括:

  • 色彩編碼

  • 執行指令碼

  • 原始程式碼控制

  • 剖析指令碼

  • Showplan

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

若要開啟作用中 Database Engine 查詢編輯器視窗的 SQLCMD 腳本,請使用下列程式。

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

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

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

  • 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而言, 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 公用程式