2015-10-06 75 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到更动态的东西。或者,等到它出现问题时才开始解决问题,但这可能不是最好的方法;) –

相关问题