2016-12-28 2 views
1

Я пытаюсь разобрать конкретное поле и вернуть мне только часть строки.Функция SQL String для поиска каждой итерации заданного значения и возврата

Пример:

Мой VARCHAR поле содержит следующую строку.

CN=PHLSERVER01,OU=Servers,OU=PHL,OU=Offices,DC=test,DC=test2,DC=office 
CN=NYCSFAX01,OU=Servers,OU=NYC,OU=Offices,DC=test,DC=test2,DC=office 
CN=KONGRDATA01,OU=ServersToDelete,DC=test,DC=test2,DC=office 
CN=LAXSERVER01,OU=Servers,OU=LAX,OU=Offices,DC=test,DC=test2,DC=office 

Я просто хочу запросить и вернуть имя CN (общее имя). Таким образом, в этом примере я хочу видеть:

PHLSERVER01,NYCSFAX01,KONGRDATA01,LAXSERVER01 
+1

если вы используете SQL Server 2016 можно использовать STRING_SPLIT см HTTPS://msdn.microsoft.com/en-us/library/mt684588.aspx – ironstone13

+0

@ ironstone13 К сожалению, на SQL 2016, но SQL 2008 R2 –

+0

В более ранней версии SQL Server вы можете написать функцию для эмуляции STRING_SPLIT который разбивает строку на таблицу, для примера см. это сообщение https://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql.html – ironstone13

ответ

1

С помощью функции Split/Разбор (много вариантов)

Declare @YourTable table (ID int,SomeString varchar(max)) 
Insert Into @YourTable values 
(1,'CN=PHLSERVER01,OU=Servers,OU=PHL,OU=Offices,DC=test,DC=test2,DC=office CN=NYCSFAX01,OU=Servers,OU=NYC,OU=Offices,DC=test,DC=test2,DC=office CN=KONGRDATA01,OU=ServersToDelete,DC=test,DC=test2,DC=office CN=LAXSERVER01,OU=Servers,OU=LAX,OU=Offices,DC=test,DC=test2,DC=office') 


Select A.ID 
     ,CN = B.RetVal 
From @YourTable A 
Cross Apply (
       Select RetVal=Replace(RetVal,'CN=','') 
       From (
         Select RetSeq = Row_Number() over (Order By (Select null)) 
           ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
         From (Select x = Cast('<x>'+ replace((Select Replace(A.SomeString,' ',',') as [*] For XML Path('')),',','</x><x>')+'</x>' as xml).query('.')) as A 
         Cross Apply x.nodes('x') AS B(i) 
         ) C 
        Where RetVal Like '%CN=%' 
      ) B 

Возвращает

ID CN 
1 PHLSERVER01 
1 NYCSFAX01 
1 KONGRDATA01 
1 LAXSERVER01 
+0

Я считаю, что это лучший ответ, но есть ли способ сделать это без добавления функции в базу данных? –

+0

@StevenCellini Уверенный один момент –

+0

@StevenCellini Обновленный ответ –

0

, если вы используете SQL Server 2016 можно использовать STRING_SPLIT разделить значение запятой полукокса, а затем выбрать только те записи, которые начинаются с CN с помощью CHARINDEX

в более ранних версиях SQL Server, вы можете написать функцию, чтобы эмулировать STRING_SPLIT, который разделяет строку в таблице, для exmple просмотреть этот https://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql.html

0

самым простым решением было бы создать таблицу значных функцию, который принимает строку в качестве входных данных и возвращает таблицу o f ваши пары ключевых значений. Затем просто используйте функцию индекса строки.

DECLARE @Data NVARCHAR(MAX) 
SET @Data='CN=PHLSERVER01,OU=Servers,OU=PHL,OU=Offices,DC=test,DC=test2,DC=office CN=NYCSFAX01,OU=Servers,OU=NYC,OU=Offices,DC=test,DC=test2,DC=office CN=KONGRDATA01,OU=ServersToDelete,DC=test,DC=test2,DC=office CN=LAXSERVER01,OU=Servers,OU=LAX,OU=Offices,DC=test,DC=test2,DC=office' 

SELECT * FROM dbo.MyFunctionToConvertDelimitedStringToTable(@Data,',') 
WHERE 
CHARINDEX('CN',Key)>0