技术开发 频道

巧用SET选项提高SQL Server客户端的灵活性

  2、支持 MARS 的连接维护一组默认的 SET 选项值。在该连接下执行批处理时,将把默认的 SET 选项值复制到请求的环境。批处理结束后,该环境将复制回会话的默认设置。通过这种方法,在同一连接下同时执行的多个批处理将在独立的 SET 选项环境下运行。这是一个官方的说明,他是什么意思呢?也就是说,在同一个连接的过程中,可能会执行多个批处理作业。如果在这些批处理作业中,没有设置SET选项的话,则其默认会采用服务器的默认设置。但是如果在第一个批处理程序中采用了SET选项更改这个默认设置,那么在第一个批处理程序运行环境中就会采用这个SET选项的设置。从而可以根据企业实际的需求,在同一个连接下为每个批处理程序设置相对独立的运行环境。在支持 MARS 的连接下,如果同时执行多个批处理且它们会修改批处理执行环境,则得到的默认连接环境取决于最后执行完的批处理。也就是说,最后这个连接的参数取决于最后运行的皮处理程序中的SET选项。简单的说,除非当前的连接中断掉或者服务器实现强制重置,否则的话当前连接中的相关参数会被批处理程序中的SET选项改变。而且这个值会被多次改变。最后的参数是有最后一个批处理程序中的SET选项所决定。

  3、在触发器或者过程中也可以使用SET选项。那么跟他们结合使用时,SET选项的寿命又有多少呢?这要分情况来对待。一是要看触发器或者过程内容有没有多次使用SET选项。如在触发器中,可能一开始就利用SET选项设置了某个参数;然后某个功能执行完毕后又把这个参数恢复了默认值,再继续执行剩下的功能。在这种情况下,其有效持续时间就是触发器内部这个参数被重置之前。也就是说,在一个触发器或者内部可以先打开某个选项,然后再关闭掉。那么只有在这个选项打开与关闭之前有效。二是如果在触发器内部一开始启用了某个SET选项,后来没有把他关闭掉,那么这个选项也不会永远生效下去。通常情况下,只要当前这个触发器或者过程执行完毕后,这个SET选型就会失效。为此简单的说,这个SET选项就好象是存储器或者过程中的局部变量,其只在触发器或者过程的内部生效。

  4、如果一个过程A调用了另外一个过程B,而现在如果过程A中利用SET选项更改了某些参数,那么这个更改会否影响到过程B的运行环境将呢?答案是不确定。这主要是看过程B中有没有对这个SET选型进行重新设置。也就是说,除非在过程B中进行了显示的重置,否则来自所有更高级别的代码中的SET选项值在低级别的代码中有效。简单的说,过程A调用了过程B,则过程A中的SET选项值在过程B中同样有效。除非过程B显示的对这SET选型进行了重置。其实这个原理很简单,就好象在过程A中定义了一个变量,然后调用了过程B。此时过程B使用需要用到这个过程A中定义的变量时,他的值就是在过程A中修改后的值。当然在过程B中也可以对这个过程A中定义的变量值进行修改,如可以对这个变量的值进行重置。不过当这个过程A结束时,这个变量就会失效了。
 
  可见,这个SET选项跟程序开发过程中的局部变量与全局变量非常的相似。数据库管理员在使用这些SET选项的时候,需要注意一个基本的原则,即其作用范围往往只在当前的会话或者过程中有效。为此数据库管理员在启用某个SET选项的时候,就需要考虑一个问题,即这个改变只是针对某个特定的会话或者某个特定的作业,还是针对全部用户?如果是前者的话,则可以通过SET选项来设置。但是如果是后者的话,那么最好通过服务器设置来改变。否则的话,要为每个会话或者每个作业设置SET选型那工作量就比较大了。笔者以前学过程序开发,为此来学些这个SET选型的时候比较喜欢利用全局变量与局部变量的关系来了解这个功能。全局变量即在整个运行环境中都有效;而局部变量则只在某个作用范围内有效。就是如此简单而已。掌握了这个SET选项的作用范围之后,就可以帮助数据库管理员来确定到底是否该采用SET选项、以及在什么时候采用这个SET选项,来提高客户端连接以及用户运行环境的灵活性。

0
相关文章