检索使用临时表的存储过程结果集的列定义

时间:2017-04-19 09:12:36

标签: sql-server stored-procedures

我正在尝试使用以下查询检索存储过程的列定义:

exec sp_describe_first_result_set @tsql = N'EXEC    @return_value = [dbo].[foo]
    @DATABASENAME = dbname,
    @TABLENAME = tblname,
    @DATEFROM = N''20170101'',
    @DATETO = N''20170201'''

我收到以下回复:

  

Msg 11526,Level 16,State 1,Procedure sp_describe_first_result_set,Line 1   无法确定元数据,因为语句' INSERT INTO #Tables(CubeSchema,TableName,DateFilterColumn,SelectColumns)SELECT' Col1'' Col2'在程序' foo'使用临时表

此问题是否有解决方法?

编辑:我无权查看和/或更改存储过程,因此不幸的是,此类解决方案无法正常工作。

1 个答案:

答案 0 :(得分:1)

在不改变存储过程的情况下,答案是MAYBE。

您正在使用的选项('sp_describe_first_result_set')不能使用临时表,因为您使用的是INSERT语句。 如果您将INSERT语句更改为SELECT INTO语句,它可能适用于将数据存储到临时表中,但您仍然无法从中获取数据,因为它不可用。我不确定'sp_describe_first_result_set'的内部,但看起来它正在使用SET FMTONLY ON选项,因为临时表会失败。

因此,如果要避免这种情况,请更改存储过程以使用表变量而不是临时表(@table vs #table)。

如果您不仅限于SQL Server,并且可以使用编程语言(例如.Net使用ADO.Net)对此进行编程,则可以使用GetSchemaTable方法ExecuteReader 1}}结果,像这样:

var reader = sqlCommand.ExecuteReader();
var schemaTable = reader.GetSchemaTable();

希望它有所帮助!