ALTER PROCEDURE _tmp @ID VARCHAR(50), @PN VARCHAR(50), @Type INT AS BEGIN /********************************** -- 功能:多条件查询性能 _tmp 'K3G8KG6NN94SBBS0','K7F7FF',0 **********************************/ PRINT '测试数据条数500W' set nocount ON DECLARE @time DATETIME DECLARE @Warring VARCHAR(5000) IF(@Type=1 OR @Type=0) BEGIN SET @Warring=CHAR(10)+'第一种方式,直接拼SQL语句,有SQL注入漏洞';PRINT @Warring;SELECT @Warring SET @time=GETDATE() DECLARE @SQL VARCHAR(4000) SELECT @SQL='SELECT * FROM dbo.tb_timetest WHERE 1=1' IF(ISNULL(@ID,'')<>'') SET @SQL=@SQL+' AND id='''+@ID+'''' IF(ISNULL(@PN,'')<>'') SET @SQL=@SQL+' AND PN='''+@PN+'''' EXEC(@SQL) PRINT '所需时间_毫秒' PRINT DATEDIFF(MILLISECOND,@time,GETDATE()) END IF(@Type=2 OR @Type=0) BEGIN SET @Warring=CHAR(10)+'第二种方式,没有像第一种方式那样的SQL漏洞,但是性能大大折扣,就是耗时';PRINT @Warring;SELECT @Warring SET @time=GETDATE() SELECT * FROM dbo.tb_timetest WHERE (ISNULL(@ID,'')=''OR id = @ID) AND (PN = @PN OR @PN IS NULL) PRINT '所需时间_毫秒' PRINT DATEDIFF(MILLISECOND,@time,GETDATE()) END IF(@Type=3 OR @Type=0) BEGIN SET @Warring=CHAR(10)+'第三种方式,虽然写法没有第二种简洁,但是也没有像第一种方式那样的SQL注入漏洞,是本人目前能想到最优的';PRINT @Warring;SELECT @Warring SET @time=GETDATE() DECLARE @S NVARCHAR(4000),@P NVARCHAR(4000) SET @P=N'@ID VARCHAR(50),@PN VARCHAR(50)' SET @S='SELECT * FROM dbo.tb_timetest WHERE 1=1' IF(ISNULL(@ID,'')<>'') SET @S=@S+' AND id = @ID' IF(ISNULL(@ID,'')<>'') SET @S=@S+' AND PN = @PN' EXEC sp_executesql @S,@P,@ID=@ID,@PN=@PN PRINT '所需时间_毫秒' PRINT DATEDIFF(MILLISECOND,@time,GETDATE()) END END
SQL多条件查询安全高效比较
原创zhang155399 博主文章分类:C# ©著作权
©著作权归作者所有:来自51CTO博客作者zhang155399的原创作品,请联系作者获取转载授权,否则将追究法律责任
慎于行,敏于思!GGGGGG
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java mybites 查询条件or java多条件查询sql
单条件查询(1).编写接口方法Mapper接口 List<Brand> selectAllById(); 参数:三个 返回值结果为:List<Brand> (2).编写sql语句:sql映射文件 (3).执行方法,测试(4).结果1.编写接
java mybites 查询条件or mybatis java sql maven