Frage zu konkreter CTE

11/08/2009 - 17:12 von Dietmar | Report spam
Hallo,

habe bisher - außer in einer SQL-Schulung CTE verwendet und nun habe ich ein
Splitprogramm in Internet gefunden, das ich gut gebrauchen könnten. (siehe
unten)
Mit VARCHAR(8000) klappt's, aber ich bin mir nicht sicher dass das reicht,
deshalb würde ich gerne VARCHAR(MAX) verwenden. Doch da kriege ich diesen
Fehler:Die Typen stimmen zwischen dem Anker und dem rekursiven Teil in der
"E"-Spalte der rekursiven Abfrage "indices" nicht überein.

Kann mir jemand erklàren warum und wie kann manx das àndern?

Danke im voraus
Dietmar



CREATE FUNCTION Split2
(
@StringToSplit VARCHAR(8000),
@Separator VARCHAR(128)
)
RETURNS TABLE
AS
RETURN
WITH indices AS
(
SELECT
0 S,
1 E
UNION ALL
SELECT
E,
CHARINDEX(@Separator, @StringToSplit, E) + LEN(@Separator)
FROM
indices
WHERE
E > S
)
SELECT
SUBSTRING(@StringToSplit, S, CASE WHEN E > LEN(@Separator) THEN
e-s-len(@Separator) ELSE LEN(@StringToSplit) - s + 1 END) String,
S StartIndex
FROM
indices
WHERE
S > 0

GO
 

Lesen sie die antworten

#1 Elmar Boye
11/08/2009 - 17:57 | Warnen spam
Hallo Dietmar,

"Dietmar" schrieb ...
habe bisher - außer in einer SQL-Schulung CTE verwendet und nun habe ich ein Splitprogramm in Internet gefunden, das ich gut
gebrauchen könnten. (siehe unten)
Mit VARCHAR(8000) klappt's, aber ich bin mir nicht sicher dass das reicht, deshalb würde ich gerne VARCHAR(MAX) verwenden. Doch da
kriege ich diesen Fehler:Die Typen stimmen zwischen dem Anker und dem rekursiven Teil in der "E"-Spalte der rekursiven Abfrage
"indices" nicht überein.



CHARINDEX liefert bei (N)VARCHAR(MAX) einen bigint, siehe Doku.

Ein initiales
SELECT
CAST(0 AS bigint) S,
CAST(1 AS bigint) E
UNION ALL

würde dem Abhilfe schaffen.

Nur würde ich von dem Ansatz abraten:
Denn wenn die Liste sehr groß werden kann, wird auch die Rekursionstiefe
sehr hoch, und irgendwann geht Dir der Stack Speicher aus, dagegen hilft
auch kein MAXRECURSION = 0.

Erland Sommarskog hat eine exzellente Zusammenstellung von Funktionen,
inkl. Analyse: http://www.sommarskog.se/arrays-in-sql-2005.html
auf die Du zurückgreifen solltest.
(Auf die rekursive Variante geht er dort auch ein).

Gruß Elmar

Ähnliche fragen