如何 select 来自或存储 sp_describe_first_result_set 的结果

How to select from or store result of sp_describe_first_result_set

当我们在 SQL 服务器中调用存储过程 sp_describe_first_result_set 时,它会向我们显示描述所传递查询内容的行 return。

是否可以对这个结果进行操作?例如,它的 select 列,存储在一个变量中,等等 - 似乎存储过程本身只是 return 正常的代码(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 填充到临时 table #t。想法是用与 SP returns 相同的列创建 temp table 然后使用 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