首页 > 技术文章 > 存储过程之查询的另类写法

Lau7 2016-04-16 08:13 原文

  在我开始记录我推荐的写法前,我先问你一个问题——假如现在有一个用户表SysUser,其中有Id、UserName、DeptId、CreateDate等字段,现在需要你写一个存储过程来查询用户表的信息,另外在查询时会根据上面列出的四个字段中的一个或多个作为条件来查询,你的写法是怎么样的呢?

  在你想出你的写法后,来看看我是怎么写的吧。

CREATE PROCEDURE SysUser_GetTable
 @Id                 INT=NULL
,@UserName           NVARCHAR(50)=NULL
,@DeptId             INT=NULL
,@BeginCreateDate    DATETIME=NULL
,@EndCreateDate      DATETIME=NULL
AS
declare @strSQL   nvarchar(100) 
declare @strWhere nvarchar(1000)=''

set @strWhere=@strWhere    
    + ISNULL(' and Id='''+LTRIM(@Id)+'''','')
    + ISNULL(' and UserName like ''%'+LTRIM(@UserName)+'%''','')
    + ISNULL(' and DeptId = '''+LTRIM(@DeptId)+'''','') 
    + ISNULL(' and CreateDate>='''+LTRIM(@BeginCreateDate)+'''','')
    + ISNULL(' and CreateDate<='''+LTRIM(@EndCreateDate)+'''','')

IF LEN(@strWhere)>0 
    SET @strWhere = STUFF(@strWhere,1,4,' WHERE')

SET @strSQL='SELECT * FROM SysUser '+@strWhere
EXEC(@strSQL)

  我不知道你的写法是不是用if来判断传进来的参数是否为空来拼接SQL,又或者不管参数是否为空直接用like来查询?

  上面的写法主要利用了ISNULL函数,用来判断传进来的参数是否为空。

  个人觉得这样的写法有两个好处:

1、把存储过程的条件放在一处来写,这样使用整个存储过程条理更清晰、更优雅。

2、解决了拼接出的SQL语句存在可有可无的条件,比如像1=1这样的条件。

  如果你有更好的写法,或者你觉得这样写有什么缺点,我也希望你能指正一下,希望大家能把一些好的东西分享出来,彼此共同成长。

推荐阅读