適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
此動態管理函式以 Transact-SQL 語句為參數,回傳該語句第一個結果集的元資料。
sys.dm_exec_describe_first_result_set 回傳與 sys.dm_exec_describe_first_result_set_for_object 相同的結果集定義,且與 sp_describe_first_result_set 類似。
語法
sys.dm_exec_describe_first_result_set(@tsql , @params , @include_browse_information)
引數
@tsql
一或多個 Transact-SQL 語句。 @tsql批次可以是 nvarchar(n) 或 nvarchar(max)。
@params
@params 提供一個參數的宣告字串,用於 Transact-SQL 批次,類似 sp_executesql於 。 參數可以是 nvarchar(n) 或 nvarchar(max)。
一個字串包含 @tsql 批次中所有參數的定義。 字串必須是 Unicode 常數或 Unicode 變數。 每個參數定義都由參數名稱和資料類型組成。
n 是一個預留位置,表示其他參數定義。 stmt 中指定的每個參數都必須在 @params 中定義。 如果語句中的 Transact-SQL 語句或批次不包含參數, 則不需要@params 。
NULL 是此參數的預設值。
@include_browse_information
若設為 1,則每個查詢會被分析為該查詢上有 FOR BROWSE 選項。 結果包含額外的鍵欄位與來源資料表資訊。
傳回的資料表
函式會回傳這些常見的中繼資料作為結果集。 每一列對應結果元資料中的一欄,並描述該欄位的類型及可空性,格式如下表所示。 如果第一個陳述句對每個控制路徑都不存在,函式會回傳一個沒有列的結果集。
| 資料行名稱 | 資料類型 | 描述 |
|---|---|---|
is_hidden |
bit | 指定欄位為額外欄位,用於瀏覽及資訊用途,實際上不會出現在結果集中。 |
column_ordinal |
int | 包含結果集中數據行的序數位置。 第一欄的位置指定為 1。 |
name |
sysname | 如果可以判斷名稱,則包含數據行的名稱。 如果沒有,那就是 NULL。 |
is_nullable |
bit | 包含下列值: 如果欄位允許 NULL值,則回傳1。如果欄位不允許 NULL值,則回傳0。如果無法確定欄位是否允許 NULL取值,則回傳1。 |
system_type_id |
int | 包含欄位資料型態的 , system_type_id 如 sys.types。 對於 CLR 類型,即使欄位 system_type_name 回傳 NULL,該欄位回傳 240。 |
system_type_name |
nvarchar(256) | 包含為數據行數據類型指定的名稱和自變數(例如長度、有效位數、小數字數)。 如果數據類型是使用者定義的別名類型,則會在這裡指定基礎系統類型。 若資料型別為 CLR 使用者定義型別,則 NULL 在此欄位回傳。 |
max_length |
smallint | 數據行的最大長度(以位元組為單位)。-1 = 數據行數據類型為 varchar(max)、 nvarchar(max)、 varbinary(max)或 xml。對於 文字 欄位, max_length 值為 16,或由 sp_tableoption 'text in row'設定的值。 |
precision |
tinyint | 如果以數值為基礎,則為數據行的有效位數。 否則傳回 0。 |
scale |
tinyint | 如果以數值為基礎,則為數據行小數字數。 否則傳回 0。 |
collation_name |
sysname | 如果以字元為基礎,則為數據行定序的名稱。 否則傳回 NULL。 |
user_type_id |
int | 針對 CLR 和別名類型,包含 user_type_id 資料行的數據類型,如 中所 sys.types指定。 否則為 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 | 包含 xml_collection_id 資料行的 數據類型,如 中所 sys.columns指定。 如果傳回的類型與 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 |
1若回傳的資料型別為 XML,且該型別保證是完整的 XML 文件(包含根節點,而非 XML 片段)。 否則傳回 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 。
NULL 若沒有 ORDER BY 清單或 ORDER BY 無法唯一確定清單,則會回傳。 針對 所 sp_describe_first_result_set傳回的所有數據列,這個值都相同。 |
order_by_is_descending |
smallint |
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。
下表列出錯誤類型及其描述。
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 自變數。
範例
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。
你可以將 sp_describe_first_result_set 條目中的範例改編 sys.dm_exec_describe_first_result_set為 。
A. 回傳關於單一 Transact-SQL 語句的資訊
下列程式代碼會傳回 Transact-SQL 語句結果的相關信息。
USE @AdventureWorks2025;
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 @AdventureWorks2025;
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 AdventureWorks2025;
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;