繁体   English   中英

使用SQL Server动态管理视图,如何获取存储的Proc参数的默认值?

[英]Using SQL Server Dynamic Management Views, how can I get a Stored Proc Parameter's Default Value?

假设我有一些简单的示例过程,如下所示:

CREATE procedure simpletestproc_prc    
(     
  @companyId int,     
  @objectid float = 5.678,     
  @personname varchar(255)  = 'hello world'  
) as        

select @companyId + 10, @objectid, @personname

我可以使用下面的查询来获取所有参数的类型和名称:

SELECT 
    *
FROM sys.procedures sp
INNER JOIN sys.parameters parm 
    ON sp.object_id = parm.object_id
INNER JOIN sys.types typ 
    ON parm.system_type_id = typ.system_type_id
WHERE sp.name = 'simpletestproc_prc'
order by parameter_id

但是这些列(甚至parm.default_value)都没有5.678或“ hello world”。 如何获取这些值? 如果有关系,可以假定使用SQL Server 2005或2008。

http://dev.mainsoft.com/Default.aspx?tabid=181

基本上,您阅读sys.comments(存储过程的文本存储在此处)

这是我使用的功能。 它既快速又脏,但是可以工作:

create function dbo.paramDefault(@ProcName VARCHAR(128),@paramName VARCHAR(64) )
returns varchar(128)
as
begin
    DECLARE @theId  INT
    DECLARE @ans    VARCHAR(128)
    DECLARE @theLine VARCHAR(2000)
    DECLARE @x      INT

    SET @theID = object_id(@procName)
    if @theID is NULL
        RETURN @ans

    SET @theLine = Object_definition (@theID)       
    SET @theLine = substring(@theLine,charIndex(@ProcName,@theLine)+len(@procName),999)
    SET @theLine = rtrim(ltrim(left(@theLine,charIndex(') as',@theLine)-1)))+','

    SET @x = charindex(@paramName,@theLine)
    IF @x > 0 
    BEGIN
        SET @theLine = rtrim(SUBSTRING(@theLine,@x,999))
        SET @x      = charindex(',',@theLine)
        SET @theLine = left(@theLine,@x-1)
        SET @x      = charIndex('=',@theLine)
        if @x > 0   SET @ans = rtrim(subString(@theLine,@x+1,999))
    END 

    RETURN @ans
end

GO
select dbo.paramDefault('simpletestProc_prc','personName')
select dbo.paramDefault('simpletestProc_prc','objectID')
select dbo.paramDefault('simpletestProc_prc','companyId')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM