我正在编写一个通用函数,用于将查询字符串直接输入到sproc中。该算法相当基本 - 循环查询键,将它们用作参数名称,而值用作参数值。所以它看起来像这样:
ArrayList pars = new ArrayList();
SqlParameter p;
int tryInt;
for (int i = 0; i < req.QueryString.Count; i++)
{
key = req.QueryString.AllKeys[i];
if (int.TryParse(req[key], out tryInt))
{
p = new SqlParameter("@" + key, SqlDbType.Int);
p.Value = tryInt;
pars.Add(p);
}
}
到目前为止这个工作正常,除了当然所有查询键必须匹配sproc的参数,如果它们不是我得到类似
的SQL异常@someParameter is not a parameter for procedure some_sproc
但是我需要能够在查询字符串中传入不会传递给sproc的变量,所以我需要一种方法来“忽略”它们。
有没有办法测试给定的存储过程是否需要某个参数?所以我可以沿着这些方向做点什么
if (paramExists("@" + key, "some_sproc") && int.TryParse(req[key], out tryInt))
{
p = new SqlParameter("@" + key, SqlDbType.Int);
p.Value = tryInt;
pars.Add(p);
}
答案 0 :(得分:5)
您可以使用SqlCommandBuilder获取SP参数:
using (SqlConnection sqlConn = new SqlConnection(yourConnStr))
using (SqlCommand sqlCmd = new SqlCommand(yourProcedureName, sqlConn))
{
sqlConn.Open();
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(sqlCmd);
// now you can check parameters in sqlCmd.Parameters
}
更多详情here
答案 1 :(得分:4)
您可以查询ANSI information_schema.parameters视图,它返回所有参数及其位置
SELECT parameter_name, ordinal_position FROM INFORMATION_SCHEMA.parameters
WHERE SPECIFIC_NAME = 'some_sproc'
答案 2 :(得分:0)
大多数DB存储“元数据”,例如可访问系统表/视图中的存储过程的结构。如果您正在使用MSS,我会查看sys.procedures和sys.parameters;加入这两个视图并按过程名称过滤。