sys.dm_exec_describe_first_result_set (Transact-SQL)
此動態管理函數接受 Transact-SQL 陳述式做為參數,並描述陳述式第一個結果集的中繼資料。
sys.dm_exec_describe_first_result_set 與 sys.dm_exec_describe_first_result_set_for_object (Transact-SQL) 有相同的結果集定義,而且與 sp_describe_first_result_set (Transact-SQL) 類似。
語法
sys.dm_exec_describe_first_result(@tsql, @params, @include_browse_information)
引數
@tsql
一個或多個 Transact-SQL 陳述式。 Transact-SQL_batch 可以是 nvarchar(n) 或 nvarchar(max)。@params
@params 會提供 Transact-SQL 批次參數的宣告字串,類似於 sp_executesql。 參數可以是 nvarchar(n) 或 nvarchar(max)。這個字串包含已內嵌在 Transact-SQL_batch 中之所有參數的定義。 此字串必須是 Unicode 常數或 Unicode 變數。 每個參數定義都由參數名稱和資料類型組成。 n 是指出其他參數定義的預留位置。 stmt 所指定的每個參數都必須在 @params 中定義。 如果陳述式中的 Transact-SQL 陳述式或批次不包含參數,就不需要 @params。 這個參數的預設值是 NULL。
@include\_browse\_information
如果設定為 1,就會分析每個查詢,如同查詢上有 FOR BROWSE 選項一樣。 會傳回其他索引鍵的資料行和來源資料表資訊。
傳回的資料表
將這個通用中繼資料當做結果集傳回。 結果中繼資料中的每個資料行都會有一個資料列,每個資料列都會使用下表所示的格式來描述資料行的類型和 Null 屬性。 如果每個控制項路徑都沒有第一個陳述式,就會傳回具有零個資料列的結果集。
資料行名稱 |
資料類型 |
說明 |
---|---|---|
is_hidden |
bit |
指定資料行是為了瀏覽和參考用途而加入的額外資料行,而不會實際顯示在結果集中。 |
column_ordinal |
int |
包含資料行在結果集中的序數位置。 第一個資料行的位置將會指定為 1。 |
name |
sysname |
如果可以判別名稱,則包含資料行名稱。 否則包含 NULL。 |
is_nullable |
bit |
包含下列值:
|
system_type_id |
int |
包含 sys.types 中所指定之資料行資料類型的 system_type_id。 針對 CLR 類型,即使 system_type_name 資料行將傳回 NULL,這個資料行將會傳回值 240。 |
system_type_name |
nvarchar(256) |
包含指定給資料行之資料類型的名稱和引數 (例如長度、有效位數、小數位數)。 如果資料類型是使用者定義的別名類型,這裡就會指定基礎系統類型。 如果資料類型是 CLR 使用者定義類型,這個資料行就會傳回 NULL。 |
max_length |
smallint |
資料行的最大長度 (以位元組為單位)。 -1 = 資料行資料類型是 varchar(max)、nvarchar(max)、varbinary(max) 或 xml。 對於 text 資料行來說,max_length 值將會是 16 或由 sp_tableoption 'text in row' 設定的值。 |
precision |
tinyint |
如果以數值為基礎,就是資料行的有效位數。 否則,便傳回 0。 |
scale |
tinyint |
如果是以數值為基礎,便是資料行的小數位數。 否則,便傳回 0。 |
collation_name |
sysname |
如果是以字元為基礎,便是資料行的定序名稱。 否則,便傳回 NULL。 |
user_type_id |
int |
針對 CLR 和別名類型,會如同 sys.types 中所指定,包含資料行資料類型的 user_type_id。 否則,便為 NULL。 |
user_type_database |
sysname |
針對 CLR 和別名類型,會包含定義類型之資料庫的名稱。 否則,便為 NULL。 |
user_type_schema |
sysname |
針對 CLR 和別名類型,會包含定義類型之結構描述的名稱。 否則,便為 NULL。 |
user_type_name |
sysname |
針對 CLR 和別名類型,會包含類型的名稱。 否則,便為 NULL。 |
assembly_qualified_type_name |
nvarchar(4000) |
針對 CLR 類型,會傳回定義類型之組件與類別的名稱。 否則,便為 NULL。 |
xml_collection_id |
int |
包含 sys.columns 中所指定資料行之資料類型的 xml_collection_id。 如果傳回的類型沒有與 XML 結構描述集合相關聯,這個資料行會傳回 NULL。 |
xml_collection_database |
sysname |
包含定義與這個類型相關聯之 XML 結構描述集合的資料庫。 如果傳回的類型沒有與 XML 結構描述集合相關聯,這個資料行會傳回 NULL。 |
xml_collection_schema |
sysname |
包含定義與這個類型相關聯之 XML 結構描述集合的結構描述。 如果傳回的類型沒有與 XML 結構描述集合相關聯,這個資料行會傳回 NULL。 |
xml_collection_name |
sysname |
包含與這個類型相關聯之 XML 結構描述集合的名稱。 如果傳回的類型沒有與 XML 結構描述集合相關聯,這個資料行會傳回 NULL。 |
is_xml_document |
bit |
如果正要傳回的資料類型是 XML,而且該類型保證是完整 XML 文件 (包含根節點),而不是 XML 片段,則傳回 1, 否則傳回 0。 |
is_case_sensitive |
bit |
如果資料行是區分大小寫的字串類型,則傳回 1。 如果不是則傳回 0。 |
is_fixed_length_clr_type |
bit |
如果資料行是固定長度的 CLR 類型,則傳回 1。 如果不是則傳回 0。 |
source_server |
sysname |
原始伺服器名稱 (如果它來自遠端伺服器)。 如同 sys.servers 中所顯示,指定此名稱。 如果資料行來自本機伺服器,或是如果無法判別其原始伺服器,則傳回 NULL。 只會在要求瀏覽資訊時填入。 |
source_database |
sysname |
這個結果中的資料行所傳回之原始資料庫名稱。 如果無法判別資料庫,則傳回 NULL。 只會在要求瀏覽資訊時填入。 |
source_schema |
sysname |
這個結果中的資料行所傳回之原始結構描述名稱。 如果無法判別結構描述,則傳回 NULL。 只會在要求瀏覽資訊時填入。 |
source_table |
sysname |
這個結果的資料行所傳回之原始資料表名稱。 如果無法判別資料表,則傳回 NULL。 只會在要求瀏覽資訊時填入。 |
source_column |
sysname |
結果資料行所傳回之原始資料行名稱。 如果無法判別資料行,則傳回 NULL。 只會在要求瀏覽資訊時填入。 |
is_identity_column |
bit |
如果資料行是識別欄位,則傳回 1;如果不是,則傳回 0。 如果它無法判別資料行是否為識別欄位,則傳回 NULL。 |
is_part_of_unique_key |
bit |
如果資料行是唯一索引 (包括唯一和主要的條件約束) 的一部分,則傳回 1,否則傳回 0。 如果無法判別資料行是否為唯一索引的一部分,則傳回 NULL。 只在要求瀏覽資訊時才會擴展。 |
is_updateable |
bit |
如果資料行是可更新的,則傳回 1;如果不是,則傳回 0。 如果它無法判別資料行是否可更新,則傳回 NULL。 |
is_computed_column |
bit |
如果資料行是計算資料行,則傳回 1,否則傳回 0。 如果無法判別資料行是否為計算資料行,則傳回 NULL。 |
is_sparse_column_set |
bit |
如果資料行是疏鬆資料行,則傳回 1,否則傳回 0。 如果無法判別資料行是否為疏鬆資料行集的一部分,則傳回 NULL。 |
ordinal_in_order_by_list |
smallint |
這個資料行在 ORDER BY 清單中的位置。 如果資料行不會顯示在 ORDER BY 清單中,或如果無法唯一判別 ORDER BY 清單,則傳回 NULL。 |
order_by_list_length |
smallint |
ORDER BY 清單的長度。 如果沒有 ORDER BY 清單,或如果無法唯一判別 ORDER BY 清單,則傳回 NULL。 請注意,對於由 sp_describe_first_result_set 傳回的所有資料列來說,這個值都是一樣的。 |
order_by_is_descending |
smallint NULL |
如果 ordinal_in_order_by_list 不是 NULL,order_by_is_descending 資料行會回報此資料行的 ORDER BY 子句方向。 否則回報 NULL。 |
error_number |
int |
包含函數傳回的錯誤號碼。 如果未發生錯誤,則資料行會包含 NULL。 |
error_severity |
int |
包含函數傳回的嚴重性。 如果未發生錯誤,則資料行會包含 NULL。 |
error_state |
int |
包含函數傳回的 狀態訊息。 如果未發生錯誤,則資料行會包含 NULL。 |
error_message |
nvarchar(4096) |
包含函數傳回的訊息。 如果未發生錯誤,則資料行會包含 NULL。 |
error_type |
int |
包含整數,代表要傳回的錯誤。 對應到 error_type_desc。 請參閱備註下的清單。 |
error_type_desc |
nvarchar(60) |
包含簡短大寫字串,表示要傳回的錯誤。 對應到 error_type。 請參閱備註下的清單。 |
備註
這個函數與 sp_describe_first_result_set 使用相同的演算法。 如需詳細資訊,請參閱<sp_describe_first_result_set (Transact-SQL)>。
下表列出錯誤類型及其說明。
error_type |
error_type |
說明 |
---|---|---|
1 |
MISC |
未說明的所有錯誤。 |
2 |
SYNTAX |
批次發生語法錯誤。 |
3 |
CONFLICTING_RESULTS |
因為兩個可能的第一個陳述式之間的衝突,無法判定結果。 |
4 |
DYNAMIC_SQL |
因為動態 SQL 可能傳回第一個結果,無法判定結果。 |
5 |
CLR_PROCEDURE |
因為 CLR 預存程序可能傳回第一個結果,無法判定結果。 |
6 |
CLR_TRIGGER |
因為 CLR 觸發程序可能傳回第一個結果,無法判定結果。 |
7 |
EXTENDED_PROCEDURE |
因為擴充預存程序可能傳回第一個結果,無法判定結果。 |
8 |
UNDECLARED_PARAMETER |
因為一個或多個結果集資料行的資料類型可能相依於未宣告的參數,無法判定結果。 |
9 |
RECURSION |
因為批次包含遞迴陳述式,無法判定結果。 |
10 |
TEMPORARY_TABLE |
因為批次包含暫存資料表且不受 sp_describe_first_result_set 支援,無法判定結果。 |
11 |
UNSUPPORTED_STATEMENT |
因為批次包含 sp_describe_first_result_set 不支援的陳述式 (例如,FETCH、REVERT 等),無法判定結果。 |
12 |
OBJECT_TYPE_NOT_SUPPORTED |
不支援傳遞至函數的 @object_id (亦即,不是預存程序) |
13 |
OBJECT_DOES_NOT_EXIST |
系統目錄中找不到傳遞至函數的 @object_id。 |
權限
需要執行 @tsql 引數的權限。
範例
主題 sp_describe_first_result_set (Transact-SQL) 中的其他範例可改寫以使用 sys.dm_exec_describe_first_result_set。
A.傳回單一 Transact-SQL 陳述式的相關資訊
下列程式碼會傳回 Transact-SQL 陳述式結果的相關資訊。
USE AdventureWorks2012;
GO
SELECT * FROM sys.dm_exec_describe_first_result_set
(N'SELECT object_id, name, type_desc FROM sys.indexes', null, 0) ;
B.傳回程序的相關資訊
下列範例會建立一個名為 pr_TestProc、可傳回兩個結果集的預存程序。 然後此範例示範 sys.dm_exec_describe_first_result_set 傳回此預存程序的第一個結果集相關資訊。
USE AdventureWorks2012;
GO
CREATE PROC Production.TestProc
AS
SELECT Name, ProductID, Color FROM Production.Product ;
SELECT Name, SafetyStockLevel, SellStartDate FROM Production.Product ;
GO
SELECT * FROM sys.dm_exec_describe_first_result_set
('Production.TestProc', NULL, 0) ;
C.從包含多個陳述式的批次傳回中繼資料
下列範例會評估包含兩個 Transact-SQL 陳述式的批次。 結果集描述第一個傳回的結果集。
USE AdventureWorks2012;
GO
SELECT * FROM sys.dm_exec_describe_first_result_set(
N'SELECT CustomerID, TerritoryID, AccountNumber FROM Sales.Customer WHERE CustomerID = @CustomerID;
SELECT * FROM Sales.SalesOrderHeader;',
N'@CustomerID int', 0) AS a;
GO
請參閱
參考
sp_describe_first_result_set (Transact-SQL)
sp_describe_undeclared_parameters (Transact-SQL)
sys.dm_exec_describe_first_result_set_for_object (Transact-SQL)