mssql server 排序 以及like语句

本文深入讲解SQL中处理NULL值排序及安全模糊查询的技巧,通过具体案例解析如何使用CASE WHEN语句调整NULL值的位置,避免数据泄露风险,适用于数据库开发及维护人员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们按照某个字段排序时,通常使用order by语句,如果该字段存在null值,则会把null值的这条放到最上面,

那我们是否有办法解决呢?

答案是肯定的:

ORDER BY CASE WHEN OrderNum IS NULL THEN 1 ELSE 0 END

这样的话,null值的这条就排队到了最后。

 

使用dapper查询数据时,有时候会用到模糊查询,像下面这样:

SELECT * FROM T_Test  WHERE Sex='男' AND (CardNo like 'xxx' OR Remark like 'xxx')

如果dapper里这么写:

public List<TestModel> Test(string sex, string keyWords){
  var sb = new StringBuilder("SELECT * FROM T_Test WHERE 1=1 ");
  sb.Append(" AND Sex=@Sex ");
  sb.Append(" AND(Content LIKE '%"+ keyWords +"%' OR Remark LIKE '%"+ keyWords +"%')");
  return DapperHelper.Query<TestModel>(sb.ToString(), new { Sex = sex}).ToList();
}

如果keyWords的参数写:%' or 1=1) --

生成的sql语句就是:

SELECT * FROM T_Test WHERE 1=1 
AND Sex='男' 
AND (Content LIKE '%%' or 1=1) --%' OR Remakr LIKE '%%')

那么恭喜你,他人将获取你所有的信息。

那我们该怎么处理呢?

那就是修改dapper方法

public List<TestModel> Test(string sex, string keyWords){
  var sb = new StringBuilder("SELECT * FROM T_Test ");
  sb.Append(" AND Sex=@Sex ");
  sb.Append(" AND(Content LIKE @KeyWords OR Remark LIKE @KeyWords )");
  return DapperHelper.Query<TestModel>(sb.ToString(), new { Sex = sex, KeyWords = '%' + keyWords + '%'}).ToList();
}

  生成的sql语句就是

exec sp_executesql N'SELECT * FROM T_Test WHERE 1=1 Sex=@Sex AND (Content LIKE @KeyWords OR Remark LIKE @KeyWords)',N'@KeyWords 
nvarchar(4000)',@KeyWords=N'%%'' or 1=1) --%'

  即使是这样,数据也不会泄露了。

转载于:https://www.cnblogs.com/mantishell/p/11343865.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值