in
IN 操作符允许我们在 WHERE 子句中规定多个值。
如:
select * from A where ID in 1,2,3,4
身为一名小小的程序猿,在日常开发中不可以避免的要和 where in 和 like 打交道,在大多数情况下
我们传的参数不多简单做下单引号、敏感字符转义之后就直接拼进了 SQL,执行查询,搞定。若有
一天你不可避免的需要提高 SQL 的查询性能,需要一次性 where in 几百、上千、甚至上万条数据时,
参数化查询将是必然进行的选择。然而如何实现 where in 和 like 的参数化查询,是个让不少人头疼
的问题。
C# 执行 SQL 语句
1)直接拼接
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "select * from Users(nolock) where UserID in(@UserID)";
comm.Parameters.Add(new SqlParameter("@UserID", SqlDbType.VarChar, -1) { Value = "1,2,3,4" });
comm.ExecuteNonQuery();
}
2)参数化
一般来数,会这样:
select * from Users(nolock) where UserID in (@UserID)
会出错(字符转数字出错)
原因在于 @查询会自动在参数两侧加入单引号,就会变成下面语句(因此能够防止 SQL 注入)
select * from Users(nolock) where UserID in ('1,2,3,4')
而不是
select * from Users(nolock) where UserID in (1,2,3,4)
这里 UserID 是 int,故会出错,当如下
comm.CommandText = "select * from Users(nolock) where UserName in(@UserName)";
comm.Parameters.Add(new SqlParameter("@UserName", SqlDbType.VarChar, -1) { Value = "'john','dudu','rabbit'" });
不会报错,但是得不到想要的结果,原因:@查询会自动在参数两侧加入单引号
从而把'john','dudu','rabbit' 当成一个大的新的字符串,就不会出结果了
解决方案:
一:
利用 SQL 内部字符串拼接+Exec 将自动添加的单引号给去掉
comm.CommandText = "exec('select * from Users(nolock) where UserID in ('+@UserID+')')";
这样自动在@两侧添加的单引号就会被+号作用掉