SET SHOWPLAN_TEXT (Transact-SQL)
適用於:SQL Server
Azure SQL 資料庫 Azure SQL 受控執行個體
導致 Microsoft SQL Server 不執行 Transact-SQL 陳述式。 相反地,SQL Server 會傳回如何執行這些陳述式的詳細資訊。
Syntax
SET SHOWPLAN_TEXT { ON | OFF }
注意
若要檢視 SQL Server 2014 (12.x) 和更早版本的 Transact-SQL 語法,請參閱舊版文件。
備註
SET SHOWPLAN_TEXT 的設定是在執行階段進行設定,而不是在剖析階段進行設定。
當 SET SHOWPLAN_TEXT 為 ON 時,SQL Server 會傳回每個 Transact-SQL 陳述式的執行資訊,而不需執行它。 將此選項設為 ON 之後,即會傳回所有後續 SQL Server 陳述式的執行計畫相關資訊,直到將此選項設為 OFF 為止。 例如,如果在 SHOWPLAN_TEXT 為 ON 時執行 CREATE TABLE 陳述式,SQL Server 就會從包含該相同資料表的後續 SELECT 陳述式中傳回錯誤訊息,通知使用者指定的資料表並不存在。 因此,後來參考這份資料表都會失敗。 當 SET SHOWPLAN_TEXT 為 OFF 時,SQL Server 會執行陳述式,而不產生內含執行計畫資訊的報表。
SET SHOWPLAN_TEXT 是要用來傳回 Microsoft Win32 命令提示字元應用程式 (例如 sqlcmd 公用程式) 的可讀取輸出。 SET SHOWPLAN_ALL 會傳回詳細的輸出,用來搭配專為了處理其輸出而設計的程式。
在預存程序中,無法指定 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL。 它們必須是批次中僅有的陳述式。
SET SHOWPLAN_TEXT 會以一組資料列的形式傳回資訊,這些資料列會形成階層式樹狀結構,呈現 SQL Server 查詢處理器在執行每個陳述式時所採取的步驟。 輸出中所反映的每個陳述式都包含單一資料列,其中含有陳述式的文字,後面再接著幾個資料列,其中含有執行步驟的詳細資料。 下表顯示輸出所包含的資料行。
資料行名稱 | 描述 |
---|---|
StmtText | 對於類型不為 PLAN_ROW 的資料列,此資料行會包含 Transact-SQL 陳述式的文字。 對於類型是 PLAN_ROW 的資料列,這個資料行包含作業的說明。 這個資料行包含實體運算子,也可能選擇性地包含邏輯運算子。 這個資料行後面可能接著取決於實體運算子的說明。 如需實體運算子的詳細資訊,請參閱 SET SHOWPLAN_ALL (Transact-SQL) 中引數資料行的詳細資訊。 |
如需在顯示計畫輸出中所能見到之實體和邏輯運算子的詳細資訊,請參閱執行程序表邏輯及實體運算子參考
權限
若要使用 SET SHOWPLAN_TEXT,您必須有執行 SET SHOWPLAN_TEXT 所針對的陳述式之適當權限,且您必須有包含所參考物件的所有資料庫之 SHOWPLAN 權限。
對於 SELECT、INSERT、UPDATE、DELETE、EXEC stored_procedure 和 EXEC user_defined_function 陳述式,若要產生執行程序表,使用者必須:
具備用來執行 Transact-SQL 陳述式的適當權限。
有包含 Transact-SQL 陳述式所參考的物件 (如資料表、檢視等等) 之所有資料庫的 SHOWPLAN 權限。
至於所有其他陳述式,例如 DDL、USE database_name、SET、DECLARE、動態 SQL 等等,只需具備執行 Transact-SQL 陳述式的適當權限。
範例
此範例示範 SQL Server 在處理陳述式時使用索引的方式。
這是使用索引的查詢:
USE AdventureWorks2022;
GO
SET SHOWPLAN_TEXT ON;
GO
SELECT *
FROM Production.Product
WHERE ProductID = 905;
GO
SET SHOWPLAN_TEXT OFF;
GO
以下為結果集:
StmtText
---------------------------------------------------
SELECT *
FROM Production.Product
WHERE ProductID = 905;
StmtText
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Seek(OBJECT:([AdventureWorks2022].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2022].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)
這是不使用索引的查詢:
USE AdventureWorks2022;
GO
SET SHOWPLAN_TEXT ON;
GO
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET SHOWPLAN_TEXT OFF;
GO
以下為結果集:
StmtText
------------------------------------------------------------------------
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
StmtText
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Scan(OBJECT:([AdventureWorks2022].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2022].[Production].[ProductCostHistory].[StandardCost]<[@1]))
另請參閱
運算子 (Transact-SQL)
SET 陳述式 (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)