有时候会有这样的需求:假设我们在很多服务器上创建了若干个实例,我现在需要写个动态脚本到每个实例去处理,而这个动态脚本需要使用到实例名或者服务器名,比如:
我有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,发送的字节数最少,其实大家有没发现,Total execution time,它也是值最小的. 本文只是抛钻引玉,欢迎网友点评,如果喜欢这样的文章,我以后会经常和大家一起讨论.