Frage zu rekursiver CTE (Zerlegen von Strings)

10/06/2009 - 10:15 von Gerald Aichholzer | Report spam
Hallo NG,

ich möchte eine Tabellenwertfunktion schreiben, die mir
alle Variablen (Buchstabenfolge in spitzen Klammern) aus
einem String extrahiert.

Mit Hilfe von Erland Sommarskogs "Arrays and Lists in
SQL Server 2005" ist mir folgendes als Basis gelungen:

declare @text varchar(200)
set @text = 'Kaufen Sie <A> oder <B>?'
;
with
cteVars(VarStart, VarEnd) as (
select
case
when charindex('<', @text) > 0
and charindex('>', @text) > charindex('<', @text)
then charindex('<', @text)
else null
end as VarStart
,case
when charindex('<', @text) > 0
and charindex('>', @text) > charindex('<', @text)
then charindex('>', @text)
else null
end as VarEnd

union all

select
case
when charindex('<', @text, VarEnd + 1) > 0
and charindex('>', @text, VarEnd + 1) > charindex('<', @text,
VarEnd + 1)
then charindex('<', @text, VarEnd + 1)
else null
end as VarStart
,case
when charindex('<', @text, VarEnd + 1) > 0
and charindex('>', @text, VarEnd + 1) > charindex('<', @text,
VarEnd + 1)
then charindex('>', @text, VarEnd + 1)
else null
end as VarEnd
from
cteVars
where
VarStart is not null
)
select * from cteVars


Das Unschöne ist, dass am Ende immer eine zusàtzliche Zeile
erzeugt wird, in der beide Spalten den Wert NULL haben.
Woran muss ich schrauben, damit diese Zeile ignoriert wird?
Irgendwie stehe ich momentan auf dem Schlauch :/

Vielen Dank und schöne Grüße,
Gerald
 

Lesen sie die antworten

#1 Frank Kalis
10/06/2009 - 10:33 | Warnen spam
On 10 Jun., 10:15, Gerald Aichholzer
wrote:

ich möchte eine Tabellenwertfunktion schreiben, die mir
alle Variablen (Buchstabenfolge in spitzen Klammern) aus
einem String extrahiert.

Mit Hilfe von Erland Sommarskogs "Arrays and Lists in
SQL Server 2005" ist mir folgendes als Basis gelungen:

declare @text varchar(200)
set @text = 'Kaufen Sie <A> oder <B>?'
;
with
cteVars(VarStart, VarEnd) as (
   select
   case
     when charindex('<', @text) > 0
      and charindex('>', @text) > charindex('<', @text)
     then charindex('<', @text)
     else null
   end as VarStart
   ,case
     when charindex('<', @text) > 0
      and charindex('>', @text) > charindex('<', @text)
     then charindex('>', @text)
     else null
   end as VarEnd

   union all

   select
   case
     when charindex('<', @text, VarEnd + 1) > 0
      and charindex('>', @text, VarEnd + 1) > charindex('<', @text,
VarEnd + 1)
     then charindex('<', @text, VarEnd + 1)
     else null
   end as VarStart
   ,case
     when charindex('<', @text, VarEnd + 1) > 0
      and charindex('>', @text, VarEnd + 1) > charindex('<', @text,
VarEnd + 1)
     then charindex('>', @text, VarEnd + 1)
     else null
   end as VarEnd
   from
     cteVars
   where
     VarStart is not null
)
select * from cteVars

Das Unschöne ist, dass am Ende immer eine zusàtzliche Zeile
erzeugt wird, in der beide Spalten den Wert NULL haben.
Woran muss ich schrauben, damit diese Zeile ignoriert wird?
Irgendwie stehe ich momentan auf dem Schlauch :/




Ohne jetzt gross analyse betrieben zu haben, kannst du die einfach
ausfiltern mit WHERE cteVars.VarStart IS NOT NULL AND cteVars.VarEnd
IS NOT NULL, oder?
Frank Kalis
Microsoft SQL Server MVP
Webmaster: http://www.insidesql.org

Ähnliche fragen