2016-09-06 5 views
3

文字列を特殊記号に基づいて複数の値に分割したい。例えば、ここに私はそれになりたい文字列SQL XML解析で文字 'TH'の文字列を分割する

JdwnrhþTHIMPHUþOTHþþ10/1991þ02/ 02 /2011þBHUTAN

です:

JdwnrhティンプーOTH 1991分の10 2011年2月2日ブータンは

私は次のSQLを使用しています:

DECLARE @delimiter VARCHAR(50) 
SET @delimiter='þ' 
;WITH CTE AS 
( 
    SELECT 
     CAST('<M>' + REPLACE(REPLACE(CAST(DATA as nvarchar(MAX)), @delimiter , '</M><M>'), '&', '&amp;') + '</M>' AS XML) 
     AS BDWCREGPREVADDR_XML 
    FROM [JACS_RAVEN_DATA_OLD].dbo.BDWCREGPREVADDR 
) 

SELECT 
    BDWCREGPREVADDR_XML.value('/M[1]', 'varchar(50)') As streetNo, 
    BDWCREGPREVADDR_XML.value('/M[2]', 'varchar(50)') As suburb, 
    BDWCREGPREVADDR_XML.value('/M[3]', 'varchar(3)') As stateCode, 
    BDWCREGPREVADDR_XML.value('/M[4]', 'varchar(10)') As postalCode, 
    BDWCREGPREVADDR_XML.value('/M[7]', 'varchar(50)') As country, 
    BDWCREGPREVADDR_XML.value('/M[5]', 'varchar(50)') As dateFrom, 
    BDWCREGPREVADDR_XML.value('/M[6]', 'varchar(50)') As dateTo 
FROM CTE 
GO 

クエリは、例として提供された以外のすべての文字列でうまく機能します。文字列以上の場合、クエリは次の値を返します。

'Jdwnrh' '' 'IMPHU' 'O' ' ' '02/02/2011' '10/1991' ' ブータン'

コードは新しい属性として文字 'TH'をとり、その文字列を分割しているようです。誰もこの問題を解決する方法を知っていますか?

+0

これはSQL Serverのように見えるので、SQL Serverタグを追加しました。 –

+0

これは、すべての文字列に 'nvarchar()'を使用すると起こりますか? –

+0

「þ」は「th」と同等と見なされる可能性があります(https://en.wikipedia.org/wiki/Thorn_ \(letter \)) – Blorgbeard

答えて

2

これはあなたの照合に関連しているようです。 Latin1_General_CS_ASでは、þ文字はthと同等と見なされます(発音すると「th」のように聞こえるOld English letterなので)。

print replace('thornþ' collate Latin1_General_CS_AS,'þ','1') 
' output: 1orn1 

これはすべての照合では当てはまりません。例えば、Latin1_General_BINに彼らは別のものです:

print replace('thornþ' collate Latin1_General_BIN,'þ','1') 
' output: thorn1 

ので、おそらくあなたは番目の文字を含む列のchanging the collationで見ることができます。

+0

ありがとうございます。私は私のソーステーブルの照合順序を変更するために次のクエリを使用し、今すぐ動作します。 ALTER TABLE [JACS_RAVEN_DATA_OLD] .dbo.BDWCREGPREVADDR ALTER COLUMNデータテキストCOLLATE Latin1_General_BIN; – user6798160