存储过程之查询的另类写法

  在我开始记录我推荐的写法前,我先问你一个问题——假如现在有一个用户表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这样的条件。

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

时间: 2024-10-12 23:18:40

存储过程之查询的另类写法的相关文章

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正常的SQL语句,使用了Union(All)查询: SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --备注信息 , ai

数据库查询的一般写法:从登陆验证小案例中得到的一些启示和经验

这几天做了一个登陆验证的案例,主要功能就是:用户输入密码进行登陆,如果输错密码三次则15分钟内不能登陆. 这个案例确实不复杂,但是其中的逻辑第一次理解确实很别扭. 从这个小案例中,我得到了几个启示,并打算以后写类似的程序都执行此标准 1.该项目中,和sql有关的操作统统放到SqlHelper中 ---所有相同的操作都应该单独定义成一个助手类. 2.该项目中,使用了参数化查询有效防止了sql注入漏洞 ---所有关于查询的并且值由用户输入的sql语句,一律不准用字符串拼接 3.该项目中,判断用户是否

SQLAlchemy教程-第二章-SQL常用查询的ORM写法

今天是2018-07-02. 今天来写一些常用的SQL查询的ORM写法. 先把Emp, 也就是员工表的模型补上. class Emp(Base): __tablename__ = 'emp' empno = Column(Integer, primary_key=True) ename = Column(String(10)) job = Column(String(9)) mgr = Column(Integer) hiredate = Column(Date) comm = Column(D

SQL Server 存储过程的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

第五天,存储过程,查询区分大小,事务处理(回滚,提交)

※存储过程存储过程是保存在数据库上的一段可执行代码.1.定义存储过程的语法是:Create procedure sp_name (参数..)Begin SQL语句End;2.调用它的方法:Call sp_name(参数-); //空参时则括号中不填内容 3.演示1)不带参数定义(delimiter用于定义结束符):DELIMITER $$CREATE PROCEDURE p1()BEGIN INSERT INTO person2 VALUES('P05','李四',0); SELECT * FR

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

SQL存储过程分页查询--只支持MSSQL2005及以上

USE [QSM] GO /****** Object: StoredProcedure [dbo].[UP_SysGetListByPage] Script Date: 04/12/2017 17:47:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create d

sql在所有存储过程中查询包含某字符串的执行语句

直接在查询分析器中执行以下代码就行: 方法一) select name from sysobjects o, syscomments s where o.id = s.id and text like '%aaaabbbb%' and o.xtype = 'P' 方法二) SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%aaaabbbb

C# 如何通过拼接XML调用存储过程来查询数据

每查询数据,需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下: /// <summary> /// 查询订单信息 /// </summary> /// <param name="WhereXML">查询条件XML格式</param> /// <param name="OrderBy">排序字段&