2011-08-09 19 views
2

我現在使用INFORMATION_SCHEMA.PARAMETERS來獲取有關存儲過程參數的信息。我需要知道參數的默認值。是否有解決方案獲取給定存儲過程的參數的默認值?是否有解決方案來獲取給定存儲過程的參數的默認值?

+0

你能解釋一下你爲什麼需要這個? –

+0

我想在我的動態C#代碼中傳遞參數值,我需要驗證。 –

+0

那麼你需要通過c#的默認值呢? – gbn

回答

4

解析SQL代碼,如果你是通過SQL命令這樣做......

的信息不存儲在系統表。從sys.parameters(在你期望它),has_default_value和DEFAULT_VALUE列,我們被告知要解析SQL:

SQL Server只保留默認值在此目錄視圖CLR對象;因此,對於Transact-SQL對象,此列的值爲0。要查看Transact-SQL對象中參數的默認值,請查詢sys.sql_modules目錄視圖的定義列,或使用OBJECT_DEFINITION系統函數。

如果has_default_value爲1,則此列的值爲該參數的默認值;否則,NULL。

證明:

CREATE PROC dbo.Paramtest (@foo int = 42) 
AS 
SET NOCOUNT ON; 
GO 

SELECT OBJECT_NAME(object_id), has_default_value, default_value 
FROM sys.parameters 
WHERE name = '@foo' AND object_id = OBJECT_ID('dbo.Paramtest') 

-- gives Paramtest, 0, NULL 
+0

如果有人發佈解析代碼,當然;-) –

0
Declare @pSProcName NVARCHAR(MAX)='ProcedureName' 

DECLARE @SQLTEXT NVARCHAR(MAX),@start int ,@end int,@SearchCode NVARCHAR(MAX) 
SELECT @SQLTEXT =OBJECT_DEFINITION(OBJECT_ID(@pSProcName)) 
SELECT @start=CHARINDEX('@',@SQLTEXT,1) 
SELECT @end =min(val) FROM (
SELECT PATINDEX('%'+CHAR(10)+'AS'+CHAR(10)+'%',@SQLTEXT) AS val 
UNION ALL SELECT PATINDEX('%'+CHAR(10)+'AS'+CHAR(13)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(13)+'AS'+CHAR(10)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(13)+'AS'+CHAR(13)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(10)+'AS'+CHAR(32)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(32)+'AS'+CHAR(10)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(32)+'AS'+CHAR(32)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(13)+'AS'+CHAR(32)+'%',@SQLTEXT) 
UNION ALL SELECT PATINDEX('%'+CHAR(32)+'AS'+CHAR(13)+'%',@SQLTEXT) 
) S 
Where s.val <> 0 

SELECT @SearchCode=SUBSTRING(@sqltext,@start,@end - @start) 
SELECT S2.parameter_id,S2.ParameterName,S2.DataType,S1.Default_Value FROM 
(
SELECT CASE WHEN Data like '%=%' then RIGHT(Data,len(Data)-CHARINDEX('=',Data,1)) ELSE '' END as Default_Value, 
CASE WHEN Data like '%=%' then 1 ELSE 0 END as Has_default_Value 
,Data FROM(
SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) AS Data 
FROM 
(
    SELECT CAST ('<M>' + REPLACE(@SearchCode, ',', '</M><M>') + '</M>' AS XML) AS Data 

) AS A CROSS APPLY Data.nodes ('/M') AS Split(a))s 
)S1 

INNER JOIN 
(
Select p.parameter_id,p.name as ParameterName,UPPER(t.name) AS DataType from sys.all_parameters p 
Inner JOIN sys.types t 
on t.user_type_id = p.user_type_id 
where Object_name(OBJECT_ID) = @pSProcName 
) S2 
ON S1.Data LIKE '%'+S2.ParameterName+'%'+S2.DataType+'%' 
相關問題