拉出一个带有不确定长度字符串的子字符串

时间:2015-10-06 17:22:14

标签: sql-server substring

我正在尝试使用@@VERSION更新我使用Windows版本的SQL Server的表。当我运行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)

在这种情况下,我想要&#34; Windows NT 6.3&#34; (14个字符长)永远不会改变我总是想要14个字符&#34; Windows NT (某个版本) &#34;。

有时当我向某些服务器查询&#34;(管理程序)&#34;在那14个字符之后不存在或者括号和文本是不同的。我想自动执行此操作,我需要找到一种方法来提取&#34; Windows NT (某些版本) &#34;。

2 个答案:

答案 0 :(得分:1)

charindex()可让您找到字符串中子字符串的位置。它还允许您指定第三个参数以在字符串的中间开始搜索,这允许我们找到相对于另一个位置的匹配。我们会多次使用该功能。

我们需要知道所需字符串的开头及其结尾。因此,我们将搜索锚定到长度为11个字符的字符串"Windows NT "。然后我们想在匹配后立即找到下一个空格字符。为此值添加11是必要的,因此它无法在锚定匹配中找到空格字符(在&#34; NT&#34;之前和之后)。

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)
)

答案 1 :(得分:0)

如果您知道它将始终是Windows,您可以使用该事实来搜索Windows上的位置&#34;&#34;在该字符串中,因为它应该始终只存在一次。一旦知道起始位置,就可以使用子字符串并调整参数,使字符串&#34; on&#34;被删除然后只拉你的14个字符。 IE:     声明@str varchar(500)=&#39; Microsoft SQL Server xxx(SPy) - 10.0.5500.0
    (X64)     2011年9月21日22:45:45     版权所有(c)1988-2008 Microsoft Corporation     Windows NT 6.1上的标准版(64位)(Build 7601:Service Pack
    1)(VM)     &#39;     选择@str     选择SUBSTRING(@str,CHARINDEX(&#39;在Windows&#39;,@ str,1)+ 3,14)