如何从结果集中获取列名和类型的列表?

Dal*_*ale 4 sql-server metadata t-sql

假设我从以下查询中得到一个结果集:

select * 
from sys.database_files;
Run Code Online (Sandbox Code Playgroud)

对于任何给定的结果集,我希望能够查询列名和类型,以便我可以创建表来存储结果。

在 T-SQL 中执行此操作的好方法是什么?

Aar*_*and 9

参加聚会已经晚了,但只是想我会提到 SQL Server Denali 中的元数据增强功能,这将使它变得更容易 - 不仅可以在不运行查询的情况下检查查询的输出(与SET FMTONLY ON许多应用程序的行为不完全相同)今天使用),而且还可以动态构建目标表(无需从 中提取元数据所涉及的所有解析和案例工作sys.columns)。这是一个简单的示例 - 请注意,您永远不必实际运行查询来确定其结果集的形状:

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM sys.database_files';

SELECT name, system_type_name, collation_name
    FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 0)
    ORDER BY column_ordinal;
Run Code Online (Sandbox Code Playgroud)

当然,也有一些限制。如果您有一个包含多个语句的查询,名称中的短语“first_result_set”应该提供一个线索,即您只会收到有关返回数据的第一个语句的信息——例如,它不会在前导处停止SET NOCOUNT ON;。如果您直接或通过尝试遵循视​​图或同义词来引用 > 3 部分名称,也会出现问题。但是对于大多数用例来说,这将是一个受欢迎的简化。

早在 12 月,我就在博客上写了更多详细信息,还描述了其他一些元数据增强功能:


San*_*ddy 6

怎么样:

SELECT * 
INTO YourTableName 
FROM sys.database_files;
Run Code Online (Sandbox Code Playgroud)

  • 如果您想彻底了解它,请使用临时表(如#YourTableName)而不是用户表。这避免了更改用户数据库中的页面,从而使日志记录和差异备份更小。有点肛门滞留,但是嘿,那是我! (3认同)
  • 我喜欢任何将两项工作合二为一的解决方案。 (2认同)