sys.dm_exec_describe_first_result_set(Transact-SQL)

适用于:SQL ServerAzure 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相似。

Transact-SQL 语法约定

语法

sys.dm_exec_describe_first_result_set(@tsql , @params , @include_browse_information)

参数

@tsql

一个或多个 Transact-SQL 语句。 @tsql批次可以是nvarchar(nnvarchar(max)。

@params

@params 为 Transact-SQL 批次的参数提供声明字符串,类似于 sp_executesql。 参数可以是nvarchar(nnvarchar(max)。

一个包含 @tsql 批次中所有参数定义的字符串。 字符串必须是 Unicode 常量或 Unicode 变量。 每个参数定义由参数名称和数据类型组成。 n 是表示附加参数定义的占位符。 stmt 中指定的每个参数都必须在 @params 中定义。 如果语句中的 Transact-SQL 语句或批处理不包含参数, 则不需要@paramsNULL 是此参数的默认值。

@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_idsys.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 BYNULL 如果没有 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 支持(例如, FETCHREVERT, 等)。
12 OBJECT_TYPE_NOT_SUPPORTED 传递给函数的 不 @object_id 被支持(也就是说,它不是存储过程)。
13 OBJECT_DOES_NOT_EXIST 传递给函数的代码 @object_id 不在系统目录中。

权限

需要权限才能执行 @tsql 参数。

示例

本文中的代码示例使用 AdventureWorks2025AdventureWorksDW2025 示例数据库,可以从 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;