连续拆分 SQL 服务器 2012 中的字符串
Split string in SQL server 2012 in a row
字符串在
@txt nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
我想要这样的输出:
Id. Val1. Val2. Val3. Val4. Val5.
1. 2450 10 54 kb2344 kd5433.
2. 87766 500 100 ki5332108 ow09287
有人可以建议怎么做吗?
我 google 它,并找到了这个解决方案。但它用于两个逗号分隔值,但在我的例子中有五个:
DECLARE @Var NVARCHAR(100) = '2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
SELECT LEFT(@Var, CHARINDEX(';', @Var) - 1) ,SUBSTRING(@Var, CHARINDEX(';', @Var) + 1, LEN(@Var)- LEN(LEFT(@Var, CHARINDEX(';', @Var)))- LEN(RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))))) AS [Job] , RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))-1)
假设值为 1-5。这可以很容易地通过一点 XML 与 CROSS APPLY
一起完成
如果数字列是可变的,则必须使用动态。
EDIT - Changed to nvarchar
例子
Declare @txt nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
Select ID=A.RetSeq
,B.*
From (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'nvarchar(max)')))
From (Select x = Cast('<x>' + replace(@txt ,';','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) A
Cross Apply (
Select Val1 = ltrim(rtrim(xDim.value('/x[1]','nvarchar(max)')))
,Val2 = ltrim(rtrim(xDim.value('/x[2]','nvarchar(max)')))
,Val3 = ltrim(rtrim(xDim.value('/x[3]','nvarchar(max)')))
,Val4 = ltrim(rtrim(xDim.value('/x[4]','nvarchar(max)')))
,Val5 = ltrim(rtrim(xDim.value('/x[5]','nvarchar(max)')))
From (Select Cast('<x>' + replace(A.RetVal,',','</x><x>')+'</x>' as xml) as xDim) as B1
) B
Returns
ID Val1 Val2 Val3 Val4 Val5
1 2450 10 54 kb2344 kd5433
2 87766 500 100 ki5332108 ow092827
字符串在
@txt nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
我想要这样的输出:
Id. Val1. Val2. Val3. Val4. Val5.
1. 2450 10 54 kb2344 kd5433.
2. 87766 500 100 ki5332108 ow09287
有人可以建议怎么做吗?
我 google 它,并找到了这个解决方案。但它用于两个逗号分隔值,但在我的例子中有五个:
DECLARE @Var NVARCHAR(100) = '2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
SELECT LEFT(@Var, CHARINDEX(';', @Var) - 1) ,SUBSTRING(@Var, CHARINDEX(';', @Var) + 1, LEN(@Var)- LEN(LEFT(@Var, CHARINDEX(';', @Var)))- LEN(RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))))) AS [Job] , RIGHT(@Var, CHARINDEX(';', REVERSE(@Var))-1)
假设值为 1-5。这可以很容易地通过一点 XML 与 CROSS APPLY
一起完成如果数字列是可变的,则必须使用动态。
EDIT - Changed to nvarchar
例子
Declare @txt nvarchar(max)='2450,10,54,kb2344,kd5433;87766,500,100,ki5332108,ow092827'
Select ID=A.RetSeq
,B.*
From (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'nvarchar(max)')))
From (Select x = Cast('<x>' + replace(@txt ,';','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) A
Cross Apply (
Select Val1 = ltrim(rtrim(xDim.value('/x[1]','nvarchar(max)')))
,Val2 = ltrim(rtrim(xDim.value('/x[2]','nvarchar(max)')))
,Val3 = ltrim(rtrim(xDim.value('/x[3]','nvarchar(max)')))
,Val4 = ltrim(rtrim(xDim.value('/x[4]','nvarchar(max)')))
,Val5 = ltrim(rtrim(xDim.value('/x[5]','nvarchar(max)')))
From (Select Cast('<x>' + replace(A.RetVal,',','</x><x>')+'</x>' as xml) as xDim) as B1
) B
Returns
ID Val1 Val2 Val3 Val4 Val5
1 2450 10 54 kb2344 kd5433
2 87766 500 100 ki5332108 ow092827