Appearance
SQL Server 结果集表结构查询
sys.dm_exec_describe_first_result_set
基本语法
sys.dm_exec_describe_first_result_set 是一个动态管理函数,用于描述 Transact-SQL 批处理将返回的第一个结果集的元数据。
SQL
sys.dm_exec_describe_first_result_set(
@tsql AS NTRANSACT-SQL_batch,
@params AS NVARCHAR(MAX),
@browse_information_mode AS INT
)参数说明:
@tsql: 要分析的 Transact-SQL 批处理语句@params:@tsql中使用的参数定义(可选)@browse_information_mode:0: 不返回浏览信息1: 返回浏览信息,查询中出现的每个别名都被作为数据库和表名的一部分进行解析2: 返回浏览信息,查询中出现的每个别名都被作为数据库和表名的一部分进行解析,但不分析SELECT列表
返回的主要列:
| 列名 | 数据类型 | 说明 |
|---|---|---|
is_hidden | bit | 列是否为隐藏列(用于 WHERE 子句中的计算列等) |
column_ordinal | int | 列在结果集中的位置(从 0 开始) |
name | sysname | 列名(如果可确定) |
is_nullable | bit | 列是否允许 NULL |
system_type_name | nvarchar(256) | 列的数据类型 |
user_type_name | nvarchar(256) | 列的用户定义数据类型 |
max_length | smallint | 列的最大长度(字节) |
precision | tinyint | 列的精度 |
scale | tinyint | 列的小数位数 |
collation_name | sysname | 列的排序规则 |
is_identity_column | bit | 列是否为标识列 |
is_computed_column | bit | 列是否为计算列 |
使用示例
示例 1 分析简单查询:
SQL
SELECT *
FROM sys.dm_exec_describe_first_result_set(
N'SELECT EmployeeID, LastName, FirstName, HireDate FROM HumanResources.Employee',
NULL,
0
);1
2
3
4
5
6
2
3
4
5
6
示例 2 分析带参数的查询:
SQL
SELECT name,
system_type_name,
max_length,
precision,
scale,
is_nullable
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM Sales.SalesOrderHeader WHERE SalesPersonID = @SalesPersonID',
N'@SalesPersonID INT',
0
);1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
示例 3 获取存储过程的结果集结构:
SQL
SELECT column_ordinal,
name,
system_type_name,
is_nullable,
is_identity_column
FROM sys.dm_exec_describe_first_result_set(
N'EXEC uspGetEmployeeManagers @BusinessEntityID = 1',
NULL,
0
)
ORDER BY column_ordinal;1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
sp_describe_first_result_set
sp_describe_first_result_set 是一个存储过程,功能与 sys.dm_exec_describe_first_result_set 相同,但以存储过程的形式调用。
基本语法
SQL
sp_describe_first_result_set
[ @tsql = ] N'Transact-SQL_batch'
[ , [ @params = ] N'parameters' ]
[ , [ @browse_information_mode = ] <browse_information_mode> ]使用示例
SQL
EXEC sp_describe_first_result_set
@tsql = N'SELECT * FROM HumanResources.Employee',
@params = NULL,
@browse_information_mode = 0;1
2
3
4
2
3
4
区别对比
| 特性 | sys.dm_exec_describe_first_result_set | sp_describe_first_result_set |
|---|---|---|
| 类型 | 表值函数 | 存储过程 |
| 调用方式 | SELECT ... FROM ... | EXEC ... |
| 可组合性 | 可与其他查询组合使用 | 不能直接组合 |
| 返回值 | 表形式结果集 | 表形式结果集 |
| 性能 | 通常稍快 | 稍慢(存储过程开销) |
注意事项
- 这些函数只能分析第一个结果集,对于返回多个结果集的语句,只描述第一个;
- 对于动态 SQL 或依赖运行时数据的语句,分析可能不完整;
- 某些复杂的查询(如使用临时表、表变量)可能无法完全分析;
- 分析过程不会实际执行查询,因此不会产生副作用;
- 需要有执行被分析 T-SQL 语句的权限。