2010-12-28 13 views
0

ist es eine solche Tabelle in SQLServer 2008-Datenbank Nehmen wir an, ist:verketten mehrere Ergebnisse von Tabellenwertfunktion in einer einzigen Tabelle

CREATE TABLE [dbo].[Test] ( 
    [TableId] [int] IDENTITY(1,1) NOT> NULL, 
    [Data] [xml] NOT NULL 
) 

und auch Spalte Ich habe solche Tabellenwertfunktion zu analysieren Data in meinem Tisch:

ALTER FUNCTION [dbo].[fnParseTable] (@header XML) 
    RETURNS @parsedTable TABLE (
    [Type] NVARCHAR(50), 
    [Value] NVARCHAR(50) 
)  
AS BEGIN 
     --parse xml here 
RETURN 
END 

Kann ich alle Ergebnisse dieser Funktion für jede Spalte der Tabelle verketten?

Ich brauche etwas wie folgt aus:

SELECT UNION fnParseTable(Data) FROM dbo.Test 

PS. Ich weiß, ich kann es tun, Cursor, aber ich mag sicherstellen, dass es keine einfachen Lösungen

Antwort

1

Sie haben nicht eine Tabellenwertfunktion benötigen, verwenden XPath to extract these values directly in a SELECT statement

SELECT 
    Data.query('data(/xpath/to[@your="type"])') AS type, 
    Data.query('data(/xpath/to[@your="value"])') AS value 
FROM Test 
/* JOINs, WHERE HAVING, GROUP BY and/or ORDER BY clauses */ 

query() einen XPath-Ausdruck ausführt, während data() einen Wert aus dem resultierenden XML-Knoten extrahiert.

aktualisieren

MSDN Link

DECLARE @testTable TABLE(
    XmlData XML 
) 

INSERT INTO @testTable (XmlData) 
VALUES ('<row><node><key>key11</key><value>value11</value></node><node><key>key12</key><value>value12</value></node></row>') 

INSERT INTO @testTable (XmlData) 
VALUES ('<row><node><key>key21</key><value>value21</value></node><node><key>key22</key><value>value22</value></node></row>') 

INSERT INTO @testTable (XmlData) 
VALUES ('<row><node><key>key31</key><value>value31</value></node><node><key>key32</key><value>value32</value></node></row>') 

SELECT 
    nref.value('key[1]', 'nvarchar(50)') AS [key], 
    nref.value('value[1]', 'nvarchar(50)') AS value 
FROM @testTable CROSS APPLY XmlData.nodes('//node') AS R(nref) 

Ergebnis

key11 value11 
key12 value12 
key21 value21 
key22 value22 
key31 value31 
key32 value32 
+0

SELECT \t Data.query ('/ path') .value ('. [1]', 'nvarchar (100)') AS-Typ \t FROM Test. Die Ergebnisse dieser SELECT sind wie folgt aus: row1Data1row1Data2row1Data3 row1Data2row2Data2row2Data3 row1Data3row3Data2row3Data3 Also, es verkettet Werte in Strings – Egor4eg

+0

nur kann ich Ihnen geben Ihnen eine bessere Antwort, wenn für eine Zeile Beispiel XML bereitstellen und die Ausgabe, die Sie wollen. – orangepips

+0

Diese Website erlaubt kein XML in Posts. Also, ich erstellte Google Online-Dokument https://docs.google.com/document/d/1UzHz3_qb2klJJvJM9l6IoUAuxpQlm8q8m475_R_zujg/edit?hl=de Und hier das Ergebnis, das ich erwarte: https://spreadsheets.google.com/ccc?key= 0AlLEbQbwDYKNdHNuWXlvUFBMTjR2ZGRBVzdqWmNzTUE & hl = de. (Ich hoffe, Sie haben Google-Konto) – Egor4eg

0

Orangepips Antwort scheint die passende Lösung für Ihr Problem.

Aber die Frage wörtlich nehmen: JA gibt es eine Möglichkeit, eine geeignete Aggregatfunktion mit CLR in SQL-Server 2005+ zu erstellen.

Aber es ist zugegebenermaßen ein bisschen kompliziert.

Sie müssen den C# -Code kompilieren, finden Sie unter Invoking CLR User-Defined Aggregate Functions.

gelang es mir in diesem Beispiel laufen, aber ich ziehe orangepips XPath Lösungen, wenn geeignet zu verwenden, da es nur T-SQL und ist erfordert keine

sp_configure 'clr enabled',1 
reconfigure 
+1

Danke. Aber diese Lösung ist zu hässlich für mich. Und es ist noch komplexer als die Implementierung von CURSOR – Egor4eg

Verwandte Themen