【发布时间】:2014-08-28 13:38:29
【问题描述】:
我遇到了一个小问题。我想创建一个表单,要求输入过程名称并返回存储过程的参数和过程返回的列。
例如
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 选项时一样。
希望我能理解自己。
谢谢
【问题讨论】:
-
SET FMTONLY 对你有用吗?
-
这似乎只适用于查询,我有 SP。
-
问题是存储过程没有数据契约。 sql 引擎无法确定要返回的数据类型。考虑您的过程是否有一些条件,这些条件可能会根据参数返回不同的结果集。引擎如何知道将返回什么?简而言之,您尝试做的事情是不可能的。
-
@SeanLange 一个人可以评估存储过程中所有可能的路径,并检查它们是否都导致相同的记录集。如果是这样,您可以确定架构。 “sys.dm_exec_describe_first_result_set”和“sp_describe_first_result_set”就是这样做的。看我的回答。
-
当然,如果您必须评估程序的内容,那么记录输出不是更容易吗?这是 OP 似乎试图避免的。当然,也不能保证程序在评估和运行时间之间不会发生变化。
标签: sql sql-server delphi stored-procedures