存储过程中编写多条件的查询语句,很多人习惯用字符串拼接去做,字符串的拼接虽然灵活但是效率却不是很理想,因为查询语句属于字符串拼接出来,每次调用存储过程需要重新编译查询语句。
如果需要高效的查询,告别拼接吧,废话不多说,看下面的代码:
USE [MASTER]
GO
IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE NAME = N'TEST')
DROP DATABASE [TEST]
CREATE DATABASE TEST
GO
USE [TEST]
GO
CREATE TABLE [TAB1]
(
A VARCHAR(10),
B VARCHAR(10),
C VARCHAR(10),
D VARCHAR(10),
)
GO
INSERT INTO [TAB1] VALUES('A','B','C','D')
GO
/*
1.字符串拼接查询语句
*/
CREATE PROC [PROC1]
@A VARCHAR(10)=NULL,
@B VARCHAR(10)=NULL,
@C VARCHAR(10)=NULL,
@D VARCHAR(10)=NULL
AS
BEGIN
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT * FROM [TAB1] WHERE 1=1 '
IF @A IS NOT NULL
SET @SQL=@SQL+'AND [A]='''+@A+''''
IF @B IS NOT NULL
SET @SQL=@SQL+'AND [B]='''+@B+''''
IF @C IS NOT NULL
SET @SQL=@SQL+'AND [C]='''+@C+''''
IF @D IS NOT NULL
SET @SQL=@SQL+'AND [D]='''+@D+''''
EXEC(@SQL)
END
GO
/*
2.高效的查询语句
*/
CREATE PROC [PROC2]
@A VARCHAR(10)=NULL,
@B VARCHAR(10)=NULL,
@C VARCHAR(10)=NULL,
@D VARCHAR(10)=NULL
AS
BEGIN
SELECT * FROM [TAB1] WHERE
((@A IS NOT NULL AND [A]=@A) OR (@A IS NULL)) AND
((@B IS NOT NULL AND [B]=@B) OR (@B IS NULL)) AND
((@C IS NOT NULL AND [C]=@C) OR (@C IS NULL)) AND
((@D IS NOT NULL AND [D]=@D) OR (@D IS NULL))
END
代码不多,下面测试一下两个存储过程的性能
proc1 循环100次 耗时:0.156秒
proc1 循环200次 耗时:0.373秒
proc1 循环300次 耗时:0.733秒
proc2 循环100次 耗时:0.106秒
proc2 循环200次 耗时:0.326秒
proc2 循环300次 耗时:0.623秒
备注:此结果不能作为性能提升依据 |