如果易用性和性能很重要,请获取PatExtract8k 的副本。
这是一个基本示例,我在任何不是字母或数字的字符上进行拆分 ([^a-z0-9]):
-- Sample String
DECLARE @string VARCHAR(8000) = 'abc.123&xyz!4445556__5566^rrr';
-- Basic Use
SELECT pe.* FROM samd.patExtract8K(@string,'[^a-z0-9]') AS pe;
输出:
itemNumber itemIndex itemLength item
--------------- ----------- ----------- -------------
1 1 3 abc
2 5 3 123
3 9 3 xyz
4 13 7 4445556
5 22 4 5566
6 27 3 rrr
它会返回您所需要的以及:
- 项目的长度(ItemLength)
- 它在字符串中的位置(ItemIndex)
- 它在字符串中的序号位置 (ItemNumber.)
现在对着桌子。在这里,我们正在做同样的事情,但我会明确指出我想用作分隔符的字符。这里是这些字符中的任何一个:*.&,?%/>
-- Sample Table
DECLARE @table TABLE (SomeId INT IDENTITY, SomeString VARCHAR(100));
INSERT @table VALUES('abc***332211,,XXX'),('abc.123&&555%jjj'),('ll/111>ff?12345');
SELECT t.*, pe.*
FROM @table AS t
CROSS APPLY samd.patExtract8K(t.SomeString,'[*.&,?%/>]') AS pe;
这会返回:
SomeId SomeString itemNumber itemIndex itemLength item
----------- ------------------- ------------ ---------- ----------- ---------
1 abc***332211,,XXX 1 1 3 abc
1 abc***332211,,XXX 2 7 6 332211
1 abc***332211,,XXX 3 15 3 XXX
2 abc.123&&555%jjj 1 1 3 abc
2 abc.123&&555%jjj 2 5 3 123
2 abc.123&&555%jjj 3 10 3 555
2 abc.123&&555%jjj 4 14 3 jjj
3 ll/111>ff?12345 1 1 2 ll
3 ll/111>ff?12345 2 4 3 111
3 ll/111>ff?12345 3 8 2 ff
3 ll/111>ff?12345 4 11 5 12345
另一方面 - 如果我想提取分隔符,我可以像这样更改模式:[^*.&,?%/>]。现在返回相同的查询:
SomeId itemNumber itemIndex itemLength item
----------- -------------------- -------------------- ----------- ---------
1 1 4 3 ***
1 2 13 2 ,,
2 1 4 1 .
2 2 8 2 &&
2 3 13 1 %
3 1 3 1 /
3 2 7 1 >
3 3 10 1 ?