2015-10-06 56 views
0

我想用@@VERSION來更新一個表,我有一個SQL Server的Windows版本。當我運行SELECT @@VERSION我得到拉出一個不確定長度的字符串的子字符串

Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29 
Copyright (c) Microsoft Corporation 
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600:) (Hypervisor) 

,在這種情況下,我想「的Windows NT 6.3」(14個字符),將永遠不會改變我總是希望14個字符「的Windows NT (有的版本) 」。

有時候,當我查詢某些服務器時,「(管理程序)」不存在,或者那些14個字符後的括號和文本不同。我想自動化這一點,我需要找到一種方法來拉出只是「Windows NT (某些版本)」。

+0

查找「Windows NT」,然後在那之後立即查找「)」。 'charindex()'和'substring()' – shawnt00

+0

我想我誤讀了你想要的部分。但如果空間是可靠的分隔符,那麼仍然很容易。 – shawnt00

回答

1

charindex()讓你找到字符串中子字符串的位置。它還讓你指定第三個參數來開始在字符串中間搜索,這使我們能夠找到相對於另一個位置的匹配。我們會多次使用該功能。

我們需要知道我們想要的字符串的開始和結束。所以我們將搜索定位到長度爲11個字符的字符串"Windows NT "。然後我們要在匹配後立即找到下一個空格字符。這是需要添加11到該值,因此沒有找到固定的比賽裏面的空格字符(之前和之後的「NT」。)

charindex('Windows NT ', @@version) /* start of match */ 
charindex(' ', @@version, charindex('Windows NT ', @@version) + 11) /* end of match */ 

這兩個表達式識別字符串偏移,但substring()需要知道長度來提取這意味着它需要知道偏移之間的差異。由於我們不想要返回值中的最後一個空格字符,因此不需要添加一個來包含它。

substring(
    @@version, 
    charindex('Windows NT ', @@version), 
    charindex(' ', @@version, charindex('Windows NT ', @@version) + 11) 
     - charindex('Windows NT ', @@version) 
) 
+0

雖然這段代碼可能會回答這個問題,但提供關於爲什麼和/或代碼如何回答這個問題的附加上下文會提高它的長期價值。 – JAL

+0

謝謝你現在解決了我的問題。 –

0

如果你知道它永遠是Windows,您可以使用這一事實來搜索,其中「在Windows」是在該字符串,因爲它應該永遠永遠只能是出現一次。一旦你知道了開始的位置,你可以使用子字符串並調整參數,使得字符串「on」被刪除,然後只需拉你的14個字符。 IE: 聲明@str VARCHAR(500)=「Microsoft SQL Server的XXX(SPY) - 10.0.5500.0
(X64) 2011年9月21日22點45分45秒 版權所有(C)1988-2008微軟公司 標準在Windows NT 6.1上的版本(64位)(Build 7601:Service Pack
1)(VM) ' select @str select SUBSTRING(@str,CHARINDEX('on Windows',@ str,1)+ 3 ,14)

+0

它可能需要幾年時間才能成爲問題,但是您是否真的想依靠它總是有十四個字符? Windows NT 10.0或Windows NT 6.31? – shawnt00

+0

這是真的,你可以調整子字符串中的參數從14到更動態的東西。或者,等到它出現問題時纔開始解決問題,但這可能不是最好的方法;) –