如何选择或存储 sp_describe_first_result_set 的结果

问题描述

当我们在 sql Server 中调用存储过程 sp_describe_first_result_set 时,它向我们显示描述传入的查询将返回的内容的行。

可以对这个结果进行操作吗?例如,从中选择列,存储在变量中,等等 - 似乎存储过程本身只是像往常一样返回代码(0 或 1),但没有输出,所以是我重新创建它的唯一选择?它在内部做什么以产生结果?

例如:

EXEC  @result = sp_describe_first_result_set @tsql= N'SELECT * FROM MyTable'
PRINT('status code only,not the schema  :( :( :( = ' + @result)

这在 Azure Synapse Analytics 的无服务器 sql 池部分中,因此不支持 dm_exec_describe_first_result_set

解决方法

免责声明:我在 Synapse SQL 团队工作。

您可以使用下面的代码用 sp_describe_first_result_set 的结果集填充临时表 #t。想法是创建与 SP 返回的列相同的临时表,然后使用 INSERT INTO

CREATE TABLE #t (
    is_hidden bit NOT NULL,column_ordinal int NOT NULL,name sysname NULL,is_nullable bit NOT NULL,system_type_id int NOT NULL,system_type_name nvarchar(256) NULL,max_length smallint NOT NULL,precision tinyint NOT NULL,scale tinyint NOT NULL,collation_name sysname NULL,user_type_id int NULL,user_type_database sysname NULL,user_type_schema sysname NULL,user_type_name sysname NULL,assembly_qualified_type_name nvarchar(4000),xml_collection_id int NULL,xml_collection_database sysname NULL,xml_collection_schema sysname NULL,xml_collection_name sysname NULL,is_xml_document bit NOT NULL,is_case_sensitive bit NOT NULL,is_fixed_length_clr_type bit NOT NULL,source_server nvarchar(128),source_database nvarchar(128),source_schema nvarchar(128),source_table nvarchar(128),source_column nvarchar(128),is_identity_column bit NULL,is_part_of_unique_key bit NULL,is_updateable bit NULL,is_computed_column bit NULL,is_sparse_column_set bit NULL,ordinal_in_order_by_list smallint NULL,order_by_list_length smallint NULL,order_by_is_descending smallint NULL,tds_type_id int NOT NULL,tds_length int NOT NULL,tds_collation_id int NULL,tds_collation_sort_id tinyint NULL
)
GO

INSERT INTO #t EXEC sp_describe_first_result_set N'
    SELECT 
        *
    FROM OPENROWSET(
        BULK ''https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv'',FORMAT = ''CSV'',PARSER_VERSION = ''2.0'') as [r]'

SELECT * FROM #t