我有一个简单的查询,在FROM中我有类似的东西:
WHERE ([Comment] LIKE '%something%'
OR [Comment] LIKE '%aaaa%'
OR [Commnet] LIKE '%ccc')
AND Replace([Number], ' ', '') = @number
不幸的是,现在这已经在代码中进行了硬编码,所以如果有任何变化([Comment]
字段上的更多OR,我必须在代码中更改它。是否可以像参数一样传递[Comment]
多个值(我不知道)所以我会创建一些SQL表,其中包含我想在该查询中使用的每个注释(并且用户可以在程序中添加新的注释,以便自动处理它?</ p>
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Parameters.AddWithValue("@number", varNumber);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
while (sqlQueryResult.Read()) {
string varID = sqlQueryResult["ID"].ToString();
}
}
答案 0 :(得分:2)
您可以在SQL Server 2008中使用table value parameters。
对于早期版本,您可以传入XML参数并使用XPath解析数据。
要对不同选项进行深入分析,请阅读Erland Sommarskog撰写的this文章(SQL Server 2005)和关于SQL Server 2008的additional article。
答案 1 :(得分:1)
即使Oded的解决方案似乎是最好的方式(我到目前为止还不知道),我目前以某种方式自动构建命令和参数(目前不匹配)你的问题,因为你正在使用like
):
// Some sql statement with a placeholder for all parameters (@ID0, @ID1, @ID2, ...)
string sql = "select * from table where ID in ( {0} )";
// Create a list of items of @ID0, 3; @ID1, 8; ...
var parameters = myList.Where(item => item.MatchesSomeCondition())
.Select((item, index) => new
{
Name = "@ID" + index,
Value = item.ID
});
// Add all parameters to the sqlCmd
foreach(parameter in parameters)
{
sqlCmd.Parameters.AddWithValue(parameter.Name, parameter.Value);
}
// Insert all @IDx into the sql statement
// Result: "select * from table where ID in ( @ID0, @ID1, @ID2, ... )"
sqlCmd.CommandText = String.Format(sql, String.Join(", ", parameters.Select(parameter => parameter.Name).ToArray()