mssql server 排序 以及like语句
当我们按照某个字段排序时,通常使用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) --%'
即使是这样,数据也不会泄露了。