从存储过程中获取返回的字段数据类型

时间:2014-08-28 13:38:29

标签: sql sql-server delphi stored-procedures

我遇到了一个小问题。我想创建一个请求过程名称的表单,并返回存储过程的参数和过程返回的列。

例如

 CREATE PROCEDURE abc 
    @Param1 int,
    @Param2 varchar(1)
 as
    SELECT * 
    FROM TableA 
    WHERE Param1 = @Param1 and Param2 = @Param2
 GO

我知道我可以使用此查询从SQL Server获取过程的参数

select  
   'Parameter_name' = name,  
   'Type'   = type_name(user_type_id),  
   'Length'   = max_length,  
   'Prec'   = case when type_name(system_type_id) = 'uniqueidentifier' 
              then precision  
              else OdbcPrec(system_type_id, max_length, precision) end,  
   'Scale'   = OdbcScale(system_type_id, scale),  
   'Param_order'  = parameter_id,  
   'Collation'   = convert(sysname, 
                   case when system_type_id in (35, 99, 167, 175, 231, 239)  
                   then ServerProperty('collation') end)  

  from sys.parameters where object_id = object_id('[dbo].[abc]')

从我在网上看到的内容来看,没有简单的方法可以从存储过程中获取返回的数据类型及其名称,因为结果可能因输入参数而异。

我很想知道是否有办法从SQL获取返回的数据类型及其名称,但我不介意有人能告诉我,或者引导我到一个可以找到解决方案的地方从Delphi获取返回的数据类型及其名称。类似于点击TADOStoredProc并单击AddAllFields选项时的内容。

希望我能让自己明白。

谢谢

3 个答案:

答案 0 :(得分:2)

您可以使用 sys.dm_exec_describe_first_result_set

参见示例B “返回有关过程的信息”

USE AdventureWorks2012;
GO

CREATE PROC Production.TestProc
AS
SELECT Name, ProductID, Color FROM Production.Product ;
SELECT Name, SafetyStockLevel, SellStartDate FROM Production.Product ;
GO

SELECT * FROM sys.dm_exec_describe_first_result_set
('Production.TestProc', NULL, 0) ;

http://msdn.microsoft.com/en-us/library/ff878258.aspx#code-snippet-2

它使用与 sp_describe_first_result_set 相同的算法,因此您可以在以下位置找到有关此内容的一些评论:

http://msdn.microsoft.com/en-us/library/ff878602.aspx

答案 1 :(得分:0)

这绝不是一个完整的答案,但我想说明如何使用SET FMTONLY。它可以解决部分OP的请求。

CREATE PROCEDURE abc 
    @Param1 INT
AS
    SELECT TOP(@Param1) *
    FROM master.sys.objects
GO

--When set OFF, 3 rows are returned.
SET FMTONLY OFF
EXEC abc @Param1 = 3

--When set ON, no rows are returned, but the columns and column names of the result set are returned.
SET FMTONLY ON
EXEC abc @Param1 = 3

注意:如果存储过程具有分支并且可能返回不同的结果集,则此选项不起作用。同样,这不是一个完整的答案,只是OP的演示。

答案 2 :(得分:0)

最好不要从一个存储过程返回许多不同的集合。如果必须返回多个集合,最好创建不同的过程并从每个过程返回一个统一的数据集。来自一个过程的多个结果集不应该返回。仅仅因为某些事情是可能的,并不意味着它应该被使用。