Tod*_*nce 5 c# sql-server stored-procedures sqlparameter
我已经从这样发送的存储过程中拉出参数:
foreach (SqlParameter param in cmd.Parameters)
{
if ((param.Direction == ParameterDirection.Input) || (param.Direction == ParameterDirection.InputOutput))
{
jsonReturn += "{\"paramName\":\"" + param.ParameterName + "\", \"paramType\":\"" + param.SqlDbType.ToString() + "\"},";
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了SqlParameter对象,无法找到一种方法来查看它是否可以告诉我参数是否具有默认值...(虽然我的调试器表现得很奇怪,所以谁知道).
我正在做的是为用户构建一种Stored Proc帮助器.我现在告诉他们所有属于他们选择的存储过程的参数......我真的想知道它们是否是必需的.
小智 5
更新 Devart 的 SQL - 非常感谢你,我需要找到默认值是什么,而不仅仅是他们是否有默认值,你的代码让我开始了。
它确实有一个小错误:如果参数名称包含“at”(如@d_ 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
Run Code Online (Sandbox Code Playgroud)
为了直接回答您的问题,不(可能)没有办法确定存储过程参数是否拥有“代码中”的默认值(即使用类SqlParameter)。
在 SQL Server(至少 SQL Server 2005)中,您可以查询系统目录视图sys.parameters(并将其连接到目录视图sys.procedures)并评估列的值has_default_value。
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |