2010-09-07 55 views
1

我正在使用遗留系统,我需要调用存储过程来检索我需要的数据。问题是,我不知道输出列格式是什么。在进入存储过程并从SQL中计算出输出列格式之后,有没有办法让我看看输出列的类型是什么?我可以运行存储过程,但代码很混乱,如果可以的话,我宁愿把它当作黑盒子。SQL Server 2005确定存储过程输出类型

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

+0

伟大的问题 - 不幸的是,没有任何很好的答案,恐怕.... – 2010-09-07 20:29:50

回答

1

存储的过程输出不同的结果集你会怎么办如你所知,你不能确定来自任何数据库元数据的信息(因为没有),不幸的是,你不能从结果集中确定 - 至少不是以任何可靠的,确定性的方式。

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

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

+0

我明白了。我希望有一些元数据可以被SQL Server Management Studio排除在外。我想没有,我不得不深入到存储过程的SQL源,看看我正在处理:(无论如何,感谢您的明确答案。 – quanticle 2010-09-07 21:04:49

0

如果取决于什么是......通过例如

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 FMTONLY ON; 
GO 
exec YourProc 
GO 
SET FMTONLY OFF; 
GO 
+0

我知道它不可能确定结果集静态,正是这个原因。我想我想知道的是,给定存储过程的结果集,我如何确定结果集的列类型?我已经编辑了这个问题,澄清了这一点。 – quanticle 2010-09-07 19:26:13

+0

你在哪里看到SET FMTONLY被弃用?它不在任何地方用BOL表示。 – 2010-09-07 20:30:52