我有一个像这样的SQL命令文本(可能有更多参数)
dbo.storedProcedure @JobID = 1, @JobName = 'xyz'
我想在某种集合中获取参数值和名称,然后我可以循环并将它们添加为SqlParameter
s。
例如:
foreach (Param in parameters)
{
cmd.Parameters.AddWithValue(param.Name, Param.Val)
}
然后我将从命令文本中删除参数,即dbo.storedProcedure
。
我想这样做的原因是因为我想要程序中的'ReturnValue'。我知道我可以使用CommandType.Text
并按原样传递命令文本,但是当我这样做时,我总是得到0作为返回值。
如果我设置CommandType = CommandType.StoredProcedure
并使用ReturnValue
方向的参数,我会从过程中获得正确的返回值。
我发现这个非常接近,但只给了我参数名称。我也想要这些价值观。
C# Parse SQL statement to use parameters
由于
答案 0 :(得分:1)
string commandText = "dbo.storedPorc @JobID=1, @JobName='xyz'"
string paramsX = commandText.Substring(commandText.IndexOf(' ') + 1);
Dictionary<string,string> parameters = new Dictionary<string,string>();
foreach(var s in paramsX.Split(','))
{
var finalParams = s.Split('=');
parameters.Add(s[0],s[1].Replace("'",string.Empty););
}
这个字典你可以用这种方式
foreach (KeyValuePair<string,string> param in parameters)
{
cmd.Parameters.AddWithValue(param.Key, param.Value)
}
答案 1 :(得分:0)
这将列出所有存储过程和函数及其参数。 我怀疑你可以根据自己的需求量身定制
SELECT SCHEMA_NAME(SCHEMA_ID) AS [Schema],
SO.name AS [ObjectName],
SO.Type_Desc AS [ObjectType (UDF/SP)],
P.parameter_id AS [ParameterID],
P.name AS [ParameterName],
TYPE_NAME(P.user_type_id) AS [ParameterDataType],
P.max_length AS [ParameterMaxBytes],
P.is_output AS [IsOutPutParameter]
FROM sys.objects AS SO
INNER JOIN sys.parameters AS P ON SO.OBJECT_ID = P.OBJECT_ID
WHERE SO.OBJECT_ID IN ( SELECT OBJECT_ID FROM sys.objects WHERE TYPE IN ('P','FN'))
ORDER BY [Schema], SO.name, P.parameter_id
答案 2 :(得分:0)
1)我会避免使用AddWithValue,因为它会生成查询计划缓存分析
2)如果我必须将默认值传递给param,一个简单的解决方案就是使用DEFAULT关键字
Exec dbo.proc @param1=123,@param2=DEFAULT
在C#/ VB中我会使用以下解决方案: How do you specify 'DEFAULT' as a SQL parameter value in ADO.NET?
Bassicaly,我不必知道默认值。
3)如果你想解析过程源代码以找出那些默认值,那么你应该使用TSQLScriptDom API(你可以从这个例子开始 https://blogs.msdn.microsoft.com/arvindsh/2013/04/04/using-the-transactsql-scriptdom-parser-to-get-statement-counts/)