我遇到了一个小问题。我想创建一个请求过程名称的表单,并返回存储过程的参数和过程返回的列。
例如
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选项时的内容。
希望我能让自己明白。
谢谢
答案 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 相同的算法,因此您可以在以下位置找到有关此内容的一些评论:
答案 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)
最好不要从一个存储过程返回许多不同的集合。如果必须返回多个集合,最好创建不同的过程并从每个过程返回一个统一的数据集。来自一个过程的多个结果集不应该返回。仅仅因为某些事情是可能的,并不意味着它应该被使用。