【问题标题】:Retrieve column definition for stored procedure result set that uses temp table检索使用临时表的存储过程结果集的列定义
【发布时间】:2017-04-19 09:12:36
【问题描述】:

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

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

我得到以下回复:

消息 11526,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 行
无法确定元数据,因为过程 'foo' 中的语句 'INSERT INTO #Tables(CubeSchema,TableName,DateFilterColumn,SelectColumns) SELECT 'Col1','Col2' 使用临时表

这个问题有解决办法吗?

编辑:我无权查看和/或更改存储过程,所以很遗憾,这种解决方案不起作用。

【问题讨论】:

  • 当你刚刚运行你的存储过程时,有没有返回一个结果集?所有列的名称是否正确?你的程序在做什么?如果它只是读取数据,您可能会考虑将其更改为内联表值函数。我尽量避免使用 SP,除非我想某事......
  • sp 返回一个始终相同(非条件)且所有列都正确命名的结果集。存储过程是由客户创建的,用于向我提供一些数据,因为我不允许直接查询他们的表。他们没有提供有关列数据类型的文档,我想看看它们。就是这样。
  • In this article there is discussed the same issue (with working sample!)。如果您无法更改 SP 代码 - 根据此 - 就没有什么亮点...
  • 很遗憾,我无法更改 SP 代码,也无法看到代码。它只是按原样提供,仅用于执行。

标签: sql-server stored-procedures


【解决方案1】:

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

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

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

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

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

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多