【问题标题】:SQL Server 2005 Determine Stored Procedure Output TypeSQL Server 2005 确定存储过程输出类型
【发布时间】:2010-09-07 19:12:00
【问题描述】:

我正在处理一个遗留系统,我需要调用一个存储过程来检索我需要的数据。问题是,我不知道输出列格式是什么。没有进入存储过程并从 SQL 中找出输出列格式,有没有办法让我看到输出列类型是什么?我可以很好地运行存储过程,但是代码是一团糟,如果可以的话,我宁愿把它当作一个黑盒子。

编辑:我知道我无法从数据库元数据中确定这一点,因为该过程可能会根据输入的内容返回不同的结果。我想我应该改写我的问题:给定存储过程的结果集,我如何确定列类型?

【问题讨论】:

  • 好问题 - 不幸的是,没有任何好答案,恐怕......

标签: sql-server-2005 stored-procedures


【解决方案1】:

如您所知,您无法从任何数据库元数据中确定该信息(因为没有) - 不幸的是,您也无法从结果集中确定该信息 - 至少不是以任何可靠、确定的方式。

当您调用存储过程时,您得到的只是一堆列和一堆行。没有关于这些列类型的固有信息。你能做的最好的就是猜测 - 如果数据包含字母数字字符,它是一个 VARCHAR/字符串字段。如果它只有数字,可能还有小数点分隔符,它可能是 INT 或 DECIMAL(或 MONEY 或 SMALLMONEY - 无法确定)。如果它看起来像一个 DATE 并且可以转换为一个 DATE,它可能是一个 DATE、DATETIME、DATETIME2 或类似的东西。

唯一可靠的方法是对存储过程生成的输出值有一些文档。其他任何事情充其量都是猜测。

【讨论】:

  • 我明白了。我希望 SQL Server Management Studio 遗漏了一些元数据。我想没有,我将不得不深入研究存储过程的 SQL 源代码,看看我在处理什么:( 无论如何,感谢您的明确回答。
【解决方案2】:

如果存储过程根据传入的内容输出不同的结果集,你会怎么做...例如

create procedure Test
@var int
as
if @var =1
begin
select col1,col2 from table1
end
else if @var =2
begin
select col4,col2 ,col5,col1 from table2
end
else 
begin
select * from table3
end

有一个 SET 选项,但它正在被弃用

SET FMTONLY ON;
GO
exec YourProc
GO
SET FMTONLY OFF;
GO

【讨论】:

  • 我知道不可能静态地确定结果集,正是因为这个原因。我想我想知道的是,给定存储过程的结果集,我如何确定结果集的列类型?我已经编辑了这个问题,澄清了这一点。
  • 您在哪里看到 SET FMTONLY 已被弃用?任何地方的 BOL 中都没有注明。
猜你喜欢
  • 2014-05-16
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多