TSql获取存储过程参数的元数据

时间:2017-01-26 21:05:42

标签: sql-server tsql stored-procedures

拥有这样的简单存储过程:

CREATE PROCEDURE [dbo].[ProcedureName]
    @p1IntMandatory INT ,
    @p2IntDefValueZero INT = 0 ,
    @p3VarcharWzValue VARCHAR(MAX) = 'abc' ,
    @p4DateTimeNullable DATETIME = NULL ,
    @p5IntOutWzValueZero INT = 0 OUTPUT
AS
BEGIN

    SET NOCOUNT ON;

END;

当运行此语句以获取存储过程参数元数据时,特别是“has_default_value”,“default_value”和“is_nullable”列,我发现它们的值无效。

SELECT  *
FROM    sys.parameters
WHERE   object_id = OBJECT_ID('[dbo].[ProcedureName]');

结果如下:

name                    has_default_value   default_value   is_nullable
@p1IntMandatory         0                   NULL            1
@p2IntDefValueZero      0                   NULL            1
@p3VarcharWzValue       0                   NULL            1
@p4DateTimeNullable     0                   NULL            1
@p5IntOutWzValueZero    0                   NULL            1

是否有正确的方法来获取有关存储过程的有效元数据,特别是这3列?

1 个答案:

答案 0 :(得分:0)

这里有一半开始为你做黑客攻击。这不是一个解决方案,但是评论太长了,但也许会让你开始。这是尝试将您的程序创建提取到' as'。

SELECT
    --charindex('create proc',[definition]) as SubstringStartLocation
    --,charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) SubStringLength
    substring([definition],charindex('create proc',[definition]),charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) - 1) as ProcCreation
    ,definition as ProcDefinition
FROM    sys.sql_modules 
WHERE definition like '%create proc%'

然后你必须解析那个可能变得非常棘手的专栏,但希望这会有所帮助。

此处更进一步......

if object_id('tempdb..#procs') is not null drop table #procs

SELECT
    --charindex('create proc',[definition]) as SubstringStartLocation
    --,charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) SubStringLength
    substring([definition],charindex('create proc',[definition]),charindex('as',substring([definition],charindex('create proc',[definition]),len([definition]))) - 1) as ProcCreation
    ,definition as ProcDefinition
into #procs
FROM    sys.sql_modules 
WHERE definition like '%create proc%'


select
    ProcCreation
    ,right(rtrim(ProcCreation),len(ProcCreation) - charindex('@',ProcCreation) + 1) as Variables
from #procs
where ProcCreation like '%@%'