使用C#从内联sql存储过程调用中提取参数及其值

时间:2016-06-20 16:13:40

标签: c# sql-server

我有一个像这样的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

由于

3 个答案:

答案 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,因为它会生成查询计划缓存分析

http://www.sqlpassion.at/archive/2015/07/20/how-to-pollute-your-plan-cache-with-parameterized-sql-statements/

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/