簡體   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