2016-12-28 5 views
1

特定のフィールドを解析して文字列の一部だけを返そうとしています。指定された値の各反復を検索して返すSQL文字列関数

例:

マイ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を使用している場合は、HTTPSを参照してくださいSTRING_SPLITを使用することができます/ /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

(多くのオプションが利用可能)

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

あなたはコンマcharで値を分割するSTRING_SPLITを使用して、CHARINDEX

を使用してCNで始まるレコードだけを選択することができ、SQL Serverの2016を使用している場合SQL Serverの以前のバージョンで

、あなたはexmpleのために、テーブルに文字列を分割STRING_SPLITをエミュレートする機能を書くことができますhttps://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql.html

0

この記事を参照してください最も簡単な解決策は、そのテーブル値関数を作成することです文字列を入力として受け取り、テーブルを返すあなたのキーの値のペア。次に、単に文字列インデックス関数を使用します。スプリット/ parse関数の助けを借りて

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 
関連する問題