Для этого возьмите копию patExtract8K . Тогда это просто.
Для строки это выглядит так:
DECLARE @string VARCHAR(8000) = 'E.g DQ1-12987, DQQ-12367, DS18768, AS-10383B';
SELECT
ItemNumber = ROW_NUMBER() OVER (ORDER BY f.ItemNumber),
ItemIndex = f.ItemIndex,
ItemLength = f.ItemLength,
Item = f.Item
FROM samd.patExtract8k(@string,'[^0-9]') AS f
WHERE SUBSTRING(@string,f.itemIndex+1,1) <> '-';
Возвращает:
ItemNumber ItemIndex ItemLength Item
----------- ----------- ----------- --------
1 10 5 12987
2 21 5 12367
3 30 5 18768
4 40 5 10383
Для таблицы:
-- Sample Data
CREATE TABLE #strings (stringId INT IDENTITY, string VARCHAR(1000));
INSERT #strings(string)
SELECT TOP(10) NEWID() FROM sys.all_columns;
--Solution:
SELECT *
FROM #strings AS s
CROSS APPLY samd.patExtract8k(s.string,'[^0-9]') AS f
WHERE SUBSTRING(s.string,f.itemIndex+1,1) <> '-';
Возвращает (для краткости усечено):
stringId string itemNumber itemIndex itemLength item
----------- --------------------------------------- ----------- ---------- ----------- ----------
1 8703661F-84D9-4AFC-9E8F-918926121A49 1 1 7 8703661
1 8703661F-84D9-4AFC-9E8F-918926121A49 2 10 2 84
1 8703661F-84D9-4AFC-9E8F-918926121A49 4 15 1 4
1 8703661F-84D9-4AFC-9E8F-918926121A49 5 20 1 9
1 8703661F-84D9-4AFC-9E8F-918926121A49 6 22 1 8
1 8703661F-84D9-4AFC-9E8F-918926121A49 7 25 9 918926121
1 8703661F-84D9-4AFC-9E8F-918926121A49 8 35 2 49
2 C93D48BD-9485-4E8E-9295-2271726F08C6 1 2 2 93
2 C93D48BD-9485-4E8E-9295-2271726F08C6 2 5 2 48
2 C93D48BD-9485-4E8E-9295-2271726F08C6 3 10 4 9485
2 C93D48BD-9485-4E8E-9295-2271726F08C6 4 15 1 4
2 C93D48BD-9485-4E8E-9295-2271726F08C6 5 17 1 8
2 C93D48BD-9485-4E8E-9295-2271726F08C6 6 20 4 9295
2 C93D48BD-9485-4E8E-9295-2271726F08C6 7 25 7 2271726
2 C93D48BD-9485-4E8E-9295-2271726F08C6 8 33 2 08
2 C93D48BD-9485-4E8E-9295-2271726F08C6 9 36 1 6
Функция работает очень быстро и будет любой скалярной UDF по производительности.