søndag den 30. november 2008

XQuery for SQL programmør? Offentliggørelse af data som XML

Publishing data som XML ... Hvad gjorde du forventer, naturligvis, at sådanne spørgsmål skal håndteres i en række gerne XQuery for SQL Programmør . Trods den enorme brug af XML i størstedelen ansøgning udviklingsinitiativer i disse dage, forlagsvirksomhed forhold data som XML ved hjælp af SQL-dialekter eller udvidelser er stadig tungt igennem. Besværlige betyder, at første dette er dybest håndteres gennem et andet sprog, integreret i din SQL opgørelser. Og andet, er der stadig ingen tværs database løsning til at håndtere dette, er der forskelle mellem forskellige database varianter, ofte endda mellem database versioner.

Lad? S starte med en simpel brug sag, og generere en XML-struktur som følger, baseret på BRUGERE table ,

  

Tom Jones
B
<;/bruger>

Mary Doe
A

...

I SQL Server, bl.a. ved hjælp af XML PATH,

 SELECT 
UserID som '@ id',
navn som navn,
rating som menig
fra brugere FOR XML PATH ( 'bruger'), root ( "brugere")

Eller Hvis din database støtter SQL/XML-standarden , gerne Oracle 10gR2 eller DB2 v9, kan du bruge SQL/XML forlagsvirksomhed funktioner. Her er Oracle 10gR2 variant, bemærk, at nogle af detaljerne vil skulle ændres for at få det til at fungere på DB2.

 SELECT 
xmlelement (navn "brugere",
(SELECT
xmlagg (
xmlelement (navn "bruger",
xmlattributes (UserID som id),
xmlelement (navn "navn", NAVN),
xmlelement (navn " rating "," rating ")
)
)
fra brugere)
)
FRA DUAL

I XQuery vi kunne skrive følgende. Bemærk den elegance af den løsning, som genereres XML er læsbare i forespørgslen,

  (
for $ u i indsamling ( "brugere")/USERS
vende tilbage

($ u/navn/tekst ()}
($ u/rating/tekst ()}

)

Lad? s nu udvide det eksisterende XML, og omfatter for alle brugere af tilbuddene er placeret. Forestil Dem, vi ønsker følgende slags resultat,

  

Tom Jones
B


400
1999-02-14


40
1999-03-05




...

Desværre, sådan XML-struktur ikke kan genereres via SQL Server's FOR XML PATH, og vi er nødt til at bruge FOR XML eksplicit. Hvis du? Re bekendt med det, jeg? M sikker på, at du sætter pris på nogle af detaljerne i FOR XML PATH konstruere i SQL Server. Lad mig give det en chance,

 SELECT 
tag,
moder,
[brugere! 1!],
[Bruger! 2! Id],
[bruger! 2! navn! Element],
[bruger! 2! rating! Element],
[bud! 3!],
[bud! 4! id] ,
[bud! 4! bud! Element],
[bud! 4! dato! Element]
FRA (
SELECT
1 som tag,
NULL som moderselskaber,
0 AS Sorter,
NULL AS 'brugere! 1! ",
NULL AS' bruger! 2! Id ',
NULL AS' bruger! 2 ! navn! Element ",
NULL AS 'bruger! 2! rating! Element",
NULL AS' bud! 3! ",
NULL AS 'bud! 4! id',
NULL AS 'bud! 4! bud! Element ",
NULL AS' bud! 4! dato! Element '
UNION ALL
SELECT
2 som tag,
1 som moderselskaber,
konvertere (heltal, substring (UserID, 2,2)) * 100 AS Sorter,
NULL,
UserID,
NAVN,
Rating,
NULL, NULL, NULL, NULL
fra brugere
UNION ALL
SELECT
3 som tag,
2 som moder,
Konvertere (heltal, substring (UserID, 2,2)) * 100 + 1 AS Sorter,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
fra brugere
UNION ALL
SELECT
4 AS-tag,
3 som moderselskaber,
konvertere (heltal, substring (UserID, 2,2)) * 100 + 2 AS Sorter,
NULL, NULL, NULL, NULL, NULL,
UserID,
BID,
BID_DATE
FRA TILBUDDENE
) A
KENDELSE AF Sorter
FOR XML KLAR

Og hvis du har en SQL/XML baggrund, her er en Oracle 10gR2 forenelig forespørgslen,

 SELECT 
xmlelement (navn "brugere",
(SELECT
xmlagg (
xmlelement (navn "bruger",
xmlattributes (u.USERID som id),
xmlelement (navn "navn", u.NAME) ,
xmlelement (navn "rating", u.RATING),
xmlelement (navn "tilbud",
(SELECT
xmlagg (
xmlelement (navn "tilbud" ,
xmlattributes (b.ITEMNO som id),
xmlelement (navn "tilbud", b.BID),
xmlelement (navn "dato", b.BID_DATE)
)
)
FRA TILBUDDENE b
HVOR b.USERID = u.USERID)
)
)
)
fra brugere u)
)
FRA DUAL

Den XQuery udgave er mere præcis, mere læsbare og som en konsekvens mere vedligeholdelse,

  (
for $ u i indsamling ( "brugere")/USERS
vende tilbage

($ u/navn/tekst ( ))
($ u/rating/tekst ()}
(
for $ b i indsamling ( " Bud ")/Tilbudene
hvor $ b/UserID = $ u/UserID
vende tilbage

($ b/BID/tekst ()}
($ b/BID_DATE/tekst ()}

)

)

Der er en subtil forskel mellem ovenstående SQL og XQuery forespørgsler. I SQL, hvad enten det er SQL/XML-standarden eller Microsoft SQL Server? S FOR XML tilgang, element byggeri er sprunget over i tilfælde af NULL data. Dette er ikke tilfældet med XQuery forespørgsler. Overvej følgende forespørgsel fra oven,

  (
for $ u i indsamling ( "brugere")/USERS
vende tilbage

($ u/navn/tekst ()}
($ u/rating/tekst ()) <;/rating>

)

Hvis for nogle registrere i vores database, navn eller menige er NULL, den eller element vil stadig være omfattet forespørgslen resultat. For at gøre XQuery fuldt kompatible med SQL, følgende trick kan bruges. Hidtil har vi været tilføje stien udtryk for at vælge de data, som lukkede udtryk inde i element byggebranchen,

  ($ u/rating/tekst ()} 

Hvis vi bare vælge de data, og tilføje element entreprenøren som sidste skridt i den sti udtryk, vi får den ønskede effekt.

 $ u/rating/ ( ./text ()} 

Hvis nogle bruger den rating er NULL, derefter $ u/klassificering vil evaluere til den tomme sekvens, som en konsekvens af element vil ikke oprettes.
anvende dette til vores forespørgsel har vi følgende,

  (
for $ u i indsamling ( "brugere")/brugere
Vende tilbage
(
$ u/UserID/attributten id {.},
$ u/NAVN/ (./Text ()}
$ u/rating/ (./text ()}
)
)

Jeg håber dette indlæg gav en følelse af magt og enkelhed, når det kommer til at offentliggøre relationelle data som XQuery.
Alle stillinger i XQuery for SQL Programmør serien er ca søgninger din relationelle databaser. Næste vi? Ll drøfte opdateringer. Kan du opdatere dine data via XQuery, og hvordan ser det ud sammenlignet med, hvad du er vant til i SQL?

Tech Tags: ###!! !!### 1297

Ingen kommentarer: