2011-01-04 2 views
1

In letzter Zeit ich von XML für SQL Server geblasen wurde, aber dieser hier wird mir NüsseWarum diese XML-Abfrage in SQL Server arbeiten nicht

DECLARE @xml XML; 
SET @xml = ' 
    <ROOT> 
     <Object> 
      <FooProperty1>123</FooProperty1> 
      <FooProperty2>456</FooProperty2> 
     </Object> 
     <Object> 
      <FooProperty1>123</FooProperty1> 
      <FooProperty2>456</FooProperty2> 
     </Object> 
    </ROOT> 
'; 

SELECT [doc].[FooProperty1].value('.', 'INT') AS [fooProperty1], 
     [doc].[FooProperty2].value('.', 'INT') AS [fooProperty2] 
FROM @xml.nodes('/ROOT/Object') 
AS  [doc] 
(
    [FooProperty1], 
    [FooProperty2] 
) 

mich gibt

Msg 8159, Ebene 16 , Status 1, Zeile 22 'doc' hat weniger Spalten als in der Spaltenliste angegeben wurden.

Hat msg ändert sich nicht, wenn ich @xml als

SET @xml = ' 
    <ROOT> 
     <Object FooProperty1="123" FooProperty2="456"/> 
     <Object FooProperty1="123" FooProperty2="456"/> 
    </ROOT> 
'; 

Antwort

3

Ihre XQuery nicht korrekt ändern ändern ist, glaube ich - versuchen Sie stattdessen:

SELECT 
    Root.Obj.value('(FooProperty1)[1]', 'INT') AS [fooProperty1], 
    Root.Obj.value('(FooProperty2)[1]', 'INT') AS [fooProperty2] 
FROM 
    @xml.nodes('/ROOT/Object') AS Root(Obj) 

Die @xml.nodes() definiert XML-Fragmente - eine für jeden Eintrag im XPath - und Sie müssen ihm einen Alias ​​mit zwei Bezeichnern für eine Pseudo-Tabelle mit einer einzigen Spalte zuweisen (Format:). Diese einzelne Spalte dieser Pseudo-Tabelle ist das XML-Fragment, das Ihre XPath-Abfrage aus dem XML-Dokument ausgewählt hat.

Basierend auf diesem Alias ​​können Sie dann in diese XML-Fragmente greifen und die verschiedenen Eigenschaften herausziehen.

Update: für Ihre zweite XML, mit dem XML-Attribute, verwenden Sie stattdessen:

SELECT 
    Root.Obj.value('(@FooProperty1)[1]', 'INT') AS [fooProperty1], 
    Root.Obj.value('(@FooProperty2)[1]', 'INT') AS [fooProperty2] 
FROM 
    @xml.nodes('/ROOT/Object') AS Root(Obj) 

von @FooProperty1 Angabe Sie packen die XML Attribut anstelle des XML-Unterelementes aus, dass <ROOT>/<Object> Knoten, den Sie gerade betrachten.

+0

Dieser Ansatz funktioniert nur, wenn ich das erste Muster mit zusätzlichen Elementen für jede Spalte verwende ... Könnten Sie mir vielleicht ein Beispiel für das zweite Muster geben? –

+0

Danke! .... –

+0

@Andreas Niedermair: aktualisierte meine Antwort, um auch Ihr zweites Szenario (mit XML-Attributen) zu behandeln –

Verwandte Themen