這是最簡單的答案rerieve 67(類型安全!):
SELECT CAST('<x>' + REPLACE('1,222,2,67,888,1111',',','</x><x>') + '</x>' AS XML).value('/x[4]','int')
這個問題是不是關於字符串拆分的方法,而是關於如何獲得第n個元素。最簡單的,完全inlineable方式將IMO是這樣的:
這是一個真正的一行得到第2部分用空格分隔:
DECLARE @input NVARCHAR(100)=N'part1 part2 part3';
SELECT CAST(N'<x>' + REPLACE(@input,N' ',N'</x><x>') + N'</x>' AS XML).value('/x[2]','nvarchar(max)')
當然,你可以使用變量定界符和位置(使用sql:column
檢索直接從查詢的值的位置):
DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(@input,@dlmt,N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)')
如果字符串可能包括禁止的字符,你仍然可以這樣做。首先在您的字符串上首先使用FOR XML PATH
,以隱式地使用擬合轉義序列替換所有禁止的字符。
這是一個非常特殊的情況,如果 - 另外 - 您的分隔符是分號。在這種情況下,我第一次更換分隔符爲「#DLMT#」,並替換這最後的XML標籤:
SET @input=N'Some <, > and &;Other äöü@€;One more';
SET @dlmt=N';';
SELECT CAST(N'<x>' + REPLACE((SELECT REPLACE(@input,@dlmt,'#DLMT#') AS [*] FOR XML PATH('')),N'#DLMT#',N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)');
這是相當的開銷先用沉重的遞歸CTE來分割你的字符串,只是挑out *第n個元素*。這可以做得更容易... – Shnugo