有没有办法确定存储过程中的参数是否在代码中具有默认值(因此不是必需的) – .Net?

我已经从这样发送的存储过程中拉出参数:

foreach (SqlParameter param in cmd.Parameters) { if ((param.Direction == ParameterDirection.Input) || (param.Direction == ParameterDirection.InputOutput)) { jsonReturn += "{\"paramName\":\"" + param.ParameterName + "\", \"paramType\":\"" + param.SqlDbType.ToString() + "\"},"; } } 

我查看了SqlParameter对象,无法找到一种方法来查看它是否可以告诉我参数是否具有默认值…(虽然我的调试器表现得很奇怪,所以谁知道)。

我正在做的是为用户构建一种Stored Proc帮助器。我现在告诉他们所有属于他们选择的存储过程的参数……我真的很想知道它们是否是必需的。

要直接回答你的问题,没有(可能)无法确定存储过程参数是否在代码中具有默认值(即使用SqlParameter类)。

在SQL Server(至少SQL Server 2005)中,您可以查询系统目录视图sys.parameters (并将其连接到目录视图sys.procedures )并评估列has_default_value的值。

更新到Devart的SQL – 非常感谢你,我需要找到默认值,不仅仅是他们有一个,而且你的代码让我开始了。

它确实有一个小错误:如果参数名称包含’at’(如_e_ at _e),则不处理其余参数。

使用变量也可以加快速度。

如果没有默认值,则返回null,否则返回声明中“=”和“,”之间的所有内容。

 declare @ProcName nvarchar(200) = 'your_stored_proc_name' declare @objectid int declare @type nchar(2) declare @oName nvarchar(100) declare @sName nvarchar(100) declare @Definition nvarchar(max) select @objectid = o.[object_id], @type = o.type, @oName = o.name, @sName = s.name, @Definition = replace(replace(sm.[definition], char(10),' '), char(13),' ') from sys.sql_modules sm WITH (NOLOCK) JOIN sys.objects o WITH (NOLOCK) ON sm.[object_id] = o.[object_id] JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id] WHERE o.[type] IN ('P ', 'FN', 'IF', 'TF') AND s.name + '.' + o.name = @ProcName SELECT data2.[object_name] as StoredProcedure , data2.name as ParameterName , DefaultValue = CASE WHEN data2.ptoken LIKE '%=%' THEN SUBSTRING(data2.ptoken, CHARINDEX('=', data2.ptoken)+1, CHARINDEX(',',data2.ptoken+',',CHARINDEX('=', data2.ptoken))-CHARINDEX('=', data2.ptoken)-1) ELSE null END FROM ( SELECT data.name , data.[object_name] , ptoken = SUBSTRING( data.tokens , token_pos + name_length + 1 , ISNULL(ABS(next_token_pos - token_pos - name_length - 1), LEN(data.tokens)) ) FROM ( SELECT sm3.tokens , sm3.[object_name] , p.name , name_length = LEN(p.name) , token_pos = CHARINDEX(p.name, sm3.tokens) , next_token_pos = CHARINDEX(p2.name, sm3.tokens) FROM ( SELECT sm2.[object_id] , sm2.[type] , sm2.[object_name] , tokens = REVERSE( CASE WHEN sm2.[type] IN ('FN', 'TF', 'IF') THEN SUBSTRING(sm2.tokens, ISNULL(CHARINDEX(N')', sm2.tokens) + 1, 0), LEN(sm2.tokens)) ELSE SUBSTRING(sm2.tokens, ISNULL(CHARINDEX(' SA ', sm2.tokens) + 2, 0), LEN(sm2.tokens)) END ) FROM ( SELECT @objectid as [object_id] , @type as [type] , @sName + '.' + @oName as [object_name] , tokens = REVERSE(CASE WHEN @type IN ('FN', 'TF', 'IF') THEN SUBSTRING( @Definition , CHARINDEX(N'(', @Definition) + 1 , ABS(CHARINDEX(N'RETURNS', @Definition) - CHARINDEX(N'(', @Definition) - 1) ) ELSE SUBSTRING( @Definition , CHARINDEX(@oName, @Definition) + LEN(@oName) + 1 , ABS(CHARINDEX(N' AS ', @Definition) - (CHARINDEX(@oName, @Definition) + LEN(@oname) + 1)) ) END ) ) sm2 WHERE sm2.tokens LIKE '%=%' ) sm3 JOIN sys.parameters p WITH (NOLOCK) ON sm3.[object_id] = p.[object_id] OUTER APPLY ( SELECT p2.name FROM sys.parameters p2 WITH (NOLOCK) WHERE p2.is_output = 0 AND sm3.[object_id] = p2.[object_id] AND p.parameter_id + 1 = p2.parameter_id ) p2 WHERE p.is_output = 0 ) data ) data2 

如果您正在研究用于管理SQL Server对象的开发工具,那么更好的选择可能是SMO 。 看起来您可以使用StoredProcedureParameter类获取存储过程参数的默认值。

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.parameter.defaultvalue(v=SQL.100).aspx

试试这个查询。 它返回任何存储过程/函数的默认值 –

 SELECT data2.[object_name] , data2.name , has_default_value = CASE WHEN data2.ptoken LIKE '%=%' THEN 1 ELSE 0 END FROM ( SELECT data.name , data.[object_name] , ptoken = SUBSTRING( data.tokens , token_pos + name_length + 1 , ISNULL(ABS(next_token_pos - token_pos - name_length - 1), LEN(data.tokens)) ) FROM ( SELECT sm3.tokens , sm3.[object_name] , p.name , name_length = LEN(p.name) , token_pos = CHARINDEX(p.name, sm3.tokens) , next_token_pos = CHARINDEX(p2.name, sm3.tokens) FROM ( SELECT sm2.[object_id] , sm2.[type] , sm2.[object_name] , tokens = REVERSE( CASE WHEN sm2.[type] IN ('FN', 'TF', 'IF') THEN SUBSTRING(sm2.tokens, ISNULL(CHARINDEX(N')', sm2.tokens) + 1, 0), LEN(sm2.tokens)) ELSE SUBSTRING(sm2.tokens, ISNULL(CHARINDEX('SA', sm2.tokens) + 2, 0), LEN(sm2.tokens)) END ) FROM ( SELECT sm.[object_id] , o.[type] , [object_name] = s.name + '.' + o.name , tokens = REVERSE(CASE WHEN o.[type] IN ('FN', 'TF', 'IF') THEN SUBSTRING( sm.[definition] , CHARINDEX(N'(', sm.[definition]) + 1 , ABS(CHARINDEX(N'RETURNS', sm.[definition]) - CHARINDEX(N'(', sm.[definition]) - 1) ) ELSE SUBSTRING( sm.[definition] , CHARINDEX(o.name, sm.[definition]) + LEN(o.name) + 1 , ABS(CHARINDEX(N'AS', sm.[definition])) ) END ) FROM sys.sql_modules sm WITH (NOLOCK) JOIN sys.objects o WITH (NOLOCK) ON sm.[object_id] = o.[object_id] JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id] WHERE o.[type] IN ('P ', 'FN', 'IF', 'TF') AND s.name + '.' + o.name = 'dbo.usp_test1' ) sm2 WHERE sm2.tokens LIKE '%=%' ) sm3 JOIN sys.parameters p WITH (NOLOCK) ON sm3.[object_id] = p.[object_id] OUTER APPLY ( SELECT p2.name FROM sys.parameters p2 WITH (NOLOCK) WHERE p2.is_output = 0 AND sm3.[object_id] = p2.[object_id] AND p.parameter_id + 1 = p2.parameter_id ) p2 WHERE p.is_output = 0 ) data ) data2