有时候数据库管理员在查询记录的时候有可能只是查询条件不同而其他的内容都是相同的如人事部门可能每天都需要查询当天矿工迟到早退的员工然后向人事经理汇报其实这个时候SQL语句的大部分都是相同的只是查询条件中一个时间不一样而已遇到这种情况时数据库管理员需要创建可以使用多次但每次使用不同值的查询在SQLServer数据库中把这种情况叫做参数查询
一 在什么时候使用参数符号
在SQLServer数据库中其提供的语言支持使用参数来作为查询条件如果用户需要创建每次使用不同值的查询则可以在查询中使用参数那么这个参数到底是什么呢?其实确切的说应该把这个参数叫做占位符即参数是在运行查询时提供值的占位符在SQLServer数据库中在需要显示的内容(Select子句)与查询条件(Where子句)中都可以采用参数从其他地方接收输入的值不过大部分情况下都只在查询条件中使用参数即在单个行或者组的搜索条件中使用参数作为占位符
不过并不是说只有在搜索条件中才能够使用参数只是说在搜索中参数使用的比较多而已另外有时候在表达式中可能也会用的比较多如一个ERP系统中可能会有一定的价格折扣如%的折扣那么在应用程序设计的时候就需要把这个折扣率从前台传递到后台的SQL语句中然后数据库系统根据这个折扣率把计算后的架构回传给前台的客户端在这个过程中如果能够采用参数来实现的话就可以提高SQL语句的利用率不用每次使用不同的折扣率而采用不同的SQL语句
所以说参数在SQLServer中的应用范围是非常广泛的通常情况下在SQL语句的任何部分都可以采用参数来接受外部传入的值从而避免每次参数不同而调整SQL语句的情况
二 未命名参数与命名参数
在SQLServer中参数可以分为两种即未命名参数与命名参数通常情况下如果SQL语句中只需要一个参数的话那么可以采用未命名参数如需要查询某个员工上班到现在的全部出勤信息此时就只需要用到员工编号这个参数即可此时可以采用未命名的参数不过有的时候可能查询时需要不止一个参数如现在需要查询某个员工在月份的出勤情况此时就需要两个参数分别为员工编号月份或者需要三个参数分别为员工编号开始日期结束日期等等总之要多于一个参数此时就需要使用命名参数因为如果使用未命名参数的话则数据库并不知道要把哪个参数对应到哪个地方所以说如果要在查询中使用多个参数那么此时命名参数就会非常有用
未命名的参数使用很简单不需要像应用程序开发那样先声明再使用而是在需要的地方直接输入?符号即可如需要把某个员工最为参数的话则可以使用ad_user_id =?即可这里需要注意一点这里不需要加入单引号因为正常情况下如果输入的条件是字符型的话则必须利用单引号括起来如果输入的条件是数字的话则不用单引号但是如果采用的是参数的话无论最终输入的数据类型是什么这里都不用单引号否则的话就不能够达到预期的效果
如果采用的是命名参数的话也不需要事先定义只需要在使用的时候定义参数名字即可这个定义的过程也很简单如现在用户需要按员工编号与日期来查询某个员工的出勤记录此时只需要使用AD_USER_ID=%USER_ID% AND USERDATE=%USERSDATE%从这里可以看出未命名参数与命名参数使用的参数符号是不同的在命名参数是需要中参数名字的前后使用%号表示这是一个命名参数不过这个前缀与后缀的字符数据库管理员可以根据自己的需要来进行自定义不过需要注意的就是在创建命名参数查询之前必须要先预先定义后这个参数的前缀与后缀符号
三 在循环中使用参数标记
参数不仅可以用在Select查询语句中有时候在一些循环语句中也可以使用如现在有一个股票分析系统用户自定义了只关注的股票现在这个系统要每隔秒就从数据库系统中读取这十只股票的最新价格此时该如何实现呢?
当然用户也可以在查询条件语句中通过输入个股票的代码来实现查询但是这个做非常的麻烦而且由于用户关注的股票数量不确定所以采用多个命名参数来实现的话也不现实虽然SQL语句可以接受多个参数但是其参数的数量必须是固定的像现在这种不固定的参数SQL语句也很难实现针对这种情况只有通过循环语句来实现即在SQL语句中只使用一个参数即股票代码这个参数然后通过循环语句把用户选定的股票代码一个一个的传递进去传进去第一个后数据库返回结果;然后再传进去第二个再返回结果知道最后一个参数传递完毕通常情况下可以把这个循环语句做成一个存储过程或者函数然后通过参数的个数来控制循环的次数这种解决方案可以很好的实现因为参数个数不确定而难以处理的情况当然这其中仍然参数在起着主导作用
四 在SET语句中使用参数
企业有时候可能遇到这种需求即把满足某个条件的记录中某些字段利用某个参数值来进行代替如企业可能经济效益好要把提升员工的工资其中普通员工提升%管理层员工提升%此时就需要用到SQL语句中的Update语句这更新的时候需要用到两个参数一个是员工的类别即是属于普通员工又或者是属于管理层员工;第二个参数是提升的百分比是提升%还是%
其实在实际工作中有很多地方需要用到类似地参数与语句如在ERP系统中有时候需要根据产品的类别或者供应商来更新价格;如有时候需要把好几年都没有用过的产品信息设置为不活跃;有时候需要把订单尾数少于的采购订单指定为结束等等所有数据库管理员必须要掌握这种参数与Upadate语句结合使用的案例这有助于数据库管理员在日后的工作中利用这些语句顺利完成任务
五 使用参数时的注意事项
从上面分析中可以看出使用参数与不使用参数有一个很大的区别如果直接在SQL语句中输入查询条件(不通过参数来实现)那么数据库在编译SQL语句的时候会进行语法方面的检查如果输入的条件有错误或者其数据类型跟需要比较字段的数据类型不一致或者在SET语句中需要更新的值与数据库字段的数据类型不一致的话那么数据库就会提示错误信息也就是说在执行语句之前就对了一道保障
但是如果使用参数来传递数据的话有一个不好的信息即在SQL语句执行时传递的参数是否符合要求呢?此时对数据库来说只有在SQL语句执行的时候才能够知道为了避免这种情况最好能够在应用程序那边进行相关的判断与限制如需要查询今天是否有员工旷工迟到早退等等情况一共需要两个参数一是时间二是事由(可以多选)但是这两个数据又都是比较特别的如时间是一个日期类型的数据如果在应用程序客户端用户不小心输入了一个不是日期类型的数据或者把年月日写成了年月日这很可能是笔误但这毕竟是错误数据库无法识别类似的错误为此最好能够在应用程序客户端处就进行检查如果发现这个输入的日期非法的话就在客户端把这个参数传递给数据库之前就提示参数输入错误
另外事由这个字段应该是跟列表类似的数据类型在数据库中只保存着对应的几个编码也就是说其输入的是有一定含义的序列对于这种数据在客户端上也需要进行控制其实控制起来也很简单即不要让用户自己手工输入而是通过复选框的形式来用户来进行选择然后应用程序直接根据选择的内容翻译成对应的参数然后传递给数据库中的SQL语句显然在应用程序客户端层面可以对参数的合法性进行控制最大限度的保障输入的数据符合SQL语句的要求避免因为数据类型不一致而导致SQL语句执行错误所以在SQLServer数据库使用参数的话数据库管理员还需要跟程序开发者好好沟通才能够让参数发挥其应有的作用