巧用PARSENAME函数

     有时候会有这样的需求:假设我们在很多服务器上创建了若干个实例,我现在需要写个动态脚本到每个实例去处理,而这个动态脚本需要使用到实例名或者服务器名,比如:

      我有3台服务器,分别为A,B,C,在A上装了2个命名实例为a1,a2;在B上装了2个命名实例b1,b2;C上就只装了个默认实例,环境这样,假设我现在有这样一个简单需求,要写个通用的处理脚本,在每个实例下创建一个存储过程,这个存储过程需要以"UP_{|}"这样的格式命名,也就是说如果是命名实例,则取实例名, 如果是默认实例,则取服务器名(因为默认实例的实例名为),根据环境,需要创建的存储过程列表如下:

A  -------------   UP_a1,UP_a2

B -------------    UP_b1,UP_b2

 C -------------    UP_c

通常获取后面这个命名变量的方法为:

SELECT RIGHT(@@SERVERNAME,LEN(@@SERVERNAME)-CHARINDEX('/',@@SERVERNAME))

另外还可以通过如下方法获取:

SELECT CASE @@SERVICENAME WHEN 'MSSQLSERVER' THEN @@SERVERNAME ELSE @@SERVICENAME END

一般就这2种方法获取这个变量,不知道大家有没发现,这样写起来看起来很烦琐,代码很长,有没有更简便的方法? 实际上,我们可以巧用PARSENAME这个函数来达到这样的目的,使用方法如下:

SELECT PARSENAME(REPLACE(@@SERVERNAME,'/','.'),1)
这样一来,写法上达到了简洁,那么3种写法上有没有区别呢?实践告诉我们,是有区别的,使用PARSENAME
函数是推荐的做法(在这里说明一下,虽然3种写法实际上执行效率几乎无区别,但换个角度思考,占用网络
资源最小的是DBA需要考虑的),其需要从客户端发送的字节数是最少的,其实从写法的简洁就可以看出了,
需要验证它,我们在SSMS里开启客户端统计,然后执行语句,就看出来了,参考下图


巧用PARSENAME函数_第1张图片

巧用PARSENAME函数_第2张图片

巧用PARSENAME函数_第3张图片

 

从图中,可以看出使用PARSENAME,发送的字节数最少,其实大家有没发现,Total execution time,它也是值最小的. 本文只是抛钻引玉,欢迎网友点评,如果喜欢这样的文章,我以后会经常和大家一起讨论.

 

你可能感兴趣的:(SQL,Server)