2015-10-06 3 views
0

Я пытаюсь обновить таблицу, имеющую версию Windows SQL Server, используя @@VERSION. Когда я бегу 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() позволяет найти расположение подстрок внутри строки. Также давайте укажем третий аргумент, чтобы начать поиск в середине строки, что позволяет нам найти соответствие относительно другого местоположения. Мы будем использовать эту функцию несколько раз.

Нам нужно знать начало нашей искомой строки и ее конца. Поэтому мы привязываем наш поиск к строке "Windows NT " длиной 11 символов. Затем мы хотим найти следующий пробел сразу после этого совпадения. Необходимо добавить 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 ххх (SPY) - 10.0.5500.0
(X64) 21 сентября 2011 22:45:45 Copyright (с) 1988-2008 Microsoft Corporation Standard Издание (64-разрядное) в Windows NT 6.1 (сборка 7601: пакет обновления
1) (VM) ' выберите @str выберите SUBSTRING (@str, CHARINDEX (' on Windows ', @ str, 1) + 3 , 14)

+0

Это может занять несколько лет, чтобы стать проблемой, но действительно ли вы хотите полагаться на нее, всегда будучи четырнадцатью персонажами? Windows NT 10.0 или Windows NT 6.31? – shawnt00

+0

thats true, и вы можете настроить параметр в подстроке от 14 до более динамичного. Или, просто пунт и подожди, пока не возникнет проблема, когда вы можете обратиться к нему тогда, но это, вероятно, не самый лучший способ;) –

Смежные вопросы