巧用PARSENAME函式

2021-04-18 19:03:56 字數 1366 閱讀 8550

有時候會有這樣的需求:假設我們在很多伺服器上建立了若干個例項,我現在需要寫個動態指令碼到每個例項去處理,而這個動態指令碼需要使用到例項名或者伺服器名,比如:

我有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需要考慮的),其需要從客戶端傳送的位元組數是最少的,其實從寫法的簡潔就可以看出了,

需要驗證它,我們在s**s裡開啟客戶端統計,然後執行語句,就看出來了,參考下圖

從圖中,可以看出使用parsename,傳送的位元組數最少,其實大家有沒發現,total execution time,它也是值最小的. 本文只是拋鑽引玉,歡迎網友點評,如果喜歡這樣的文章,我以後會經常和大家一起討論.

parsename函式的用法

parsename 函式的用法 返回乙個對像名特殊的部分,這此部分有物件名稱,所有者,資料名,伺服器名。注意 此函式不會直接判斷特殊物件是否存在,它只返回給定特殊對像名稱,要是找不到合適就返回null。語法 parsename object name object piece 說明 object n...

函式PARSENAME使用和擷取字串

ms sql server有乙個函式parsename object name object piece 函式有2個引數 object name 檢索的物件名稱。即是 伺服器名.資料庫名.所有者.物件名 object piece 是檢索的物件型別。其值為1 4。比如,為儲存過程或自定義函式傳入表名 ...

巧用日期時間函式

在做一張考勤表的時候會涉及到很多的日期以及星期幾,每個月的天數不一樣,每個日期又需要一一的對應星期幾。報表要實現上圖所示的樣子。思路是 客戶輸入乙個日期引數,根據這個日期在考勤表中列出該月所有的考勤資訊。要判斷輸入的這個日期所在月有幾天,如果我們自己來寫表示式計算,會很複雜,首先需要判斷年份是閏年還...