使用查詢編輯器編輯 SQLCMD 指令碼
適用於:SQL Server
Azure SQL Database
Azure SQL 受控執行個體
Azure Synapse Analytics
Analytics 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 腳本
若要開啟作用中 Database Engine 查詢編輯器視窗的 SQLCMD 腳本,請使用下列程式。
將資料庫引擎查詢編輯器視窗切換至 SQLCMD 模式
在物件總管中,以滑鼠右鍵按一下伺服器,然後選取 [新增查詢],以開啟新的 [資料庫引擎查詢編輯器] 視窗。
在 [查詢] 功能表上,選取 [SQLCMD 模式]。
查詢編輯器會在查詢編輯器的內容中執行 SQLCMD 語句。
在 [SQL 編輯器] 工具列的 [可用資料庫] 清單中,選取
AdventureWorks2022
。在 [查詢編輯器] 視窗中,輸入下列 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