Extrahieren von Teilstrings aus z.B. einer kommaseparierten Liste kann man überall nachlesen. Für Fragestellungen, bei denen es um die Extraktion von Teilstrings stets gleicher Länge geht, kann man aber auch einen anderen Lösungsansatz verwenden.
Gegeben ist folgende Aufgabe: Aus diesem String 1111222233334444555566667777888899990000 sollen Teilstrings mit einer Länge von 4 Zeichen extrahiert werden. Also schön sauber die Einsen getrennt von den Zweien usw...
DECLARE @s varchar(256)
SET @s = '1111222233334444555566667777888899990000'
SELECT
SUBSTRING(@s, Number * 4 + 1 , 4)
FROM
master..spt_values
WHERE
Type = 'P'
AND
Number
BETWEEN
0
AND
LEN(@s) / 4 - 1
GO
----
1111
2222
3333
4444
5555
6666
7777
8888
9999
0000
(10 row(s) affected)
Nun ist master..spt_values eine interne Hilfstabelle des SQL Servers. Setzt man so etwas auf Produktivsystemen ein, sollte man den Einsatz einer eigenen Zahlentabelle in Erwägung ziehen.
Ich bin zwar kein großer Freund von UDF's, aber für diese Zwecke bietet sich die Verwendung einer table-valued Function geradezu an. Hier ist der Code:
CREATE FUNCTION dbo.ExtractMe(@s VARCHAR(256))
RETURNS @MyTable TABLE (mystring CHAR(4))
AS
BEGIN
INSERT @MyTable
SELECT
SUBSTRING(@s, Number * 4 + 1 , 4)
FROM
master..spt_values
WHERE
Type = 'P'
AND
Number
BETWEEN
0
AND
LEN(@s) / 4 - 1
RETURN
END
GO
SELECT * FROM dbo.ExtractMe('1111222233334444555566667777888899990000')
DROP FUNCTION dbo.ExtractMe
mystring
--------
1111
2222
3333
4444
5555
6666
7777
8888
9999
0000
(10 row(s) affected)
Zu beachten ist noch, daß man hier auf die maximale Länge eines VARCHARs von 8.000 Zeichen beschränkt ist. Allerdings kann man ab SQL Server 2005 varchar(MAX) verwenden und damit fällt diese Restriktion weg.