您可以使用 Pattern Splitter 来做到这一点。这是从 Dwain Camp 的article 中截取的。使用的函数 PatternSplitCM 由 Chris Morris 创建。
CREATE FUNCTION [dbo].[PatternSplitCM]
(
@List VARCHAR(8000) = NULL
,@Pattern VARCHAR(50)
) RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
WITH numbers AS (
SELECT TOP(ISNULL(DATALENGTH(@List), 0))
n = ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d (n),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e (n),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) f (n),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) g (n))
SELECT
ItemNumber = ROW_NUMBER() OVER(ORDER BY MIN(n)),
Item = SUBSTRING(@List,MIN(n),1+MAX(n)-MIN(n)),
[Matched]
FROM (
SELECT n, y.[Matched], Grouper = n - ROW_NUMBER() OVER(ORDER BY y.[Matched],n)
FROM numbers
CROSS APPLY (
SELECT [Matched] = CASE WHEN SUBSTRING(@List,n,1) LIKE @Pattern THEN 1 ELSE 0 END
) y
) d
GROUP BY [Matched], Grouper
使用上面的函数,您可能希望使用模式'[^0-9]' 拆分字符串,这意味着不是数字。然后,您将旋转结果,以便相应的 number 和 character 位于同一行。之后,您使用REPLICATE 生成字符串并在结束时将它们连接起来。
您的最终查询是:
DECLARE
@String VARCHAR(8000),
@Pattern VARCHAR(50),
@Result VARCHAR(MAX)
SELECT
@String = '32,21C2L5N8C',
@Pattern = '[^0-9]',
@Result = ''
;WITH Cte AS(
SELECT
ID = (s.ItemNumber + 1)/ 2,
Number = MAX(CASE WHEN s.ItemNumber % 2 = 1 THEN s.Item END),
Character = MAX(CASE WHEN s.ItemNumber % 2 = 0 THEN s.Item END)
FROM dbo.[PatternSplitCM](@String, @Pattern) s
GROUP BY (s.ItemNumber + 1)/ 2
)
SELECT @Result = @Result + REPLICATE(Character, Number) FROM Cte ORDER BY ID
SELECT @Result
SQL Fiddle
这里是一步一步的解释:
首先,使用'[^0-9]'模式分割给定的字符串。
SELECT * FROM dbo.[PatternSplitCM](@String, @Pattern) s
结果是:
ItemNumber Item Matched
-------------------- ---------- -----------
1 32 0
2 , 1
3 21 0
4 C 1
5 2 0
6 L 1
7 5 0
8 N 1
9 8 0
10 C 1
其次,旋转结果,使相应的数字和字符位于同一行:
SELECT
ID = (s.ItemNumber + 1)/ 2,
Number = MAX(CASE WHEN s.ItemNumber % 2 = 1 THEN s.Item END),
Character = MAX(CASE WHEN s.ItemNumber % 2 = 0 THEN s.Item END)
FROM dbo.[PatternSplitCM](@String, @Pattern) s
GROUP BY (s.ItemNumber + 1)/ 2
结果是:
ID Number Character
------ ---------- ----------
1 32 ,
2 21 C
3 2 L
4 5 N
5 8 C
最后,使用REPLICATE(Number, Character) 生成每个字符串,并将它们连接起来得到最终结果:
SELECT @Result = @Result + REPLICATE(Character, Number) FROM Cte ORDER BY ID
SELECT @Result
结果是:
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,CCCCCCCCCCCCCCCCCCCCCLLNNNNNCCCCCCCC