码迷,mamicode.com
首页 > 数据库 > 详细

SQL多条件查询安全高效比较

时间:2016-01-29 20:19:11      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

ALTER  PROCEDURE _tmp
	@ID VARCHAR(50),
	@PN VARCHAR(50),
	@Type INT
AS
BEGIN
	/**********************************
		-- 功能:多条件查询性能
		_tmp ‘K3G8KG6NN94SBBS0‘,‘K7F7FF‘,0
	**********************************/
	PRINT测试数据条数500Wset 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=1IF(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=1IF(ISNULL(@ID,‘‘)<>‘‘)	SET @S=@S+‘ AND id = @IDIF(ISNULL(@ID,‘‘)<>‘‘)	SET @S=@S+‘ AND PN = @PNEXEC sp_executesql @S,@P,@ID=@ID,@PN=@PN
		
		PRINT所需时间_毫秒PRINT DATEDIFF(MILLISECOND,@time,GETDATE())
	END
END

SQL多条件查询安全高效比较

标签:

原文地址:http://www.cnblogs.com/GarsonZhang/p/5169736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!