适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
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) | 包含为列数据类型指定的名称和参数(例如,length、precision、scale)。 如果数据类型是用户定义的别名类型,则在此处指定基础系统类型。 如果数据类型是 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;