2010-12-23 3 views
3

In SQL Server 2008Wie für Aggregatfunktionen in XML umgewandelt

ich eine Abfrage wie die ausgeführt werden müssen:

DECLARE @x AS xml 
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>' 
SELECT @x.query('fn:max(r/c)') 

Aber Rückkehr nichts (offenbar weil convert xdt: untypedAtomic zu numerisch)

Wie man r/c zu varchar "wirft"?

So etwas wie

SELECT @x.query('fn:max(«CAST(r/c «AS varchar(20))»)') 

Edit: Mit Knoten die Funktion MAX von T-SQL ist keine fn: max Funktion In diesem Code:

DECLARE @x xml; 
SET @x = ''; 
SELECT @x.query('fn:max((1, 2))'); 
SELECT @x.query('fn:max(("First Text", "Other Text"))'); 

beide Abfrage Rückkehr erwartet: 2 und "Anderer Text" Fn: max kann bewerten Ausdruck Ausdruck Ad-hoc. Aber die erste Abfrage funktioniert nicht. Wie erzwinge String-Argumente zu Fn: Max?

+0

Können Sie ein Beispiel für die Ausgabe Sie suchen? – Suirtimed

+0

Ich bearbeite Post. Ich brauche Max (Erster Text, Anderer Text) = Anderer Text als Ausgabe von SELECT @ x.query ('fn: max (r/c)'). Mit numerischen Daten funktioniert diese Abfrage – renegm

+1

Sorry, ich glaube nicht, dass Sie erreichen können, was Sie wollen - mit .nodes() ist der einzige Weg, soweit ich sehen kann ..... –

Antwort

3

Dies wird das Aggregat Max-Funktion in T-SQL ausführen:

DECLARE @x AS xml 
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>' 

    SELECT 
    MAX(r.value('.','varchar(25)')) 
    FROM @x.nodes('/r/c') r([r]) 

Returns

Other Text 

nach dem Update, ich glaube, ich besser verstehe Ihre Frage. Leider scheint dies in MS SQL Server 2008 R2 nicht möglich zu sein.

DECLARE @x AS xml 
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>' 
SELECT @x.query('fn:max(xs:string(r/c))') 

Yields den Fehler:

Msg 2365, Level 16, State 1, Line 3 
XQuery [query()]: Cannot explicitly convert from 'xdt:untypedAtomic *' to 'xs:string' 

Nach Microsoft die Typumwandlung gültig ist, aber ich habe nicht in der Lage gewesen, eine Syntax zu finden, die funktioniert.

+0

Tut mir leid, aber die Verwendung von Knoten ist nicht Eine Antwort ist eine Problemumgehung. Mit Knoten die MAX-Funktion ist von T-SQL nicht XML aggregate funtion – renegm

+1

@renegm: aber es ** funktioniert ** - also warum nicht verwenden ?? –

+0

Die Nachricht ist verwirrend oder falsch: Kann nicht explizit von 'xdt: untypedAtomic *' in 'xs: string' konvertieren. Das eigentliche Problem besteht nicht darin, von einem Typ in einen anderen zu konvertieren. xs: string funktioniert gut über einen Wert, nicht über die Auswahl. Das funktioniert: SELECT @ x.query ('fn: max (xs: string ((r/c) [1]))') – renegm

3

von meinem SLoW Gehirn ... dies sollte ... arbeiten

DECLARE @x AS xml 
    , @val nvarchar(100) = 'Other Text' 
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>' 
SELECT @x.query('fn:max(for $r in //r return xs:string ($r))') 
+0

Danke! Ich habe vor langer Zeit gelöst. Ich habe den Post weggelassen. – renegm