Announcement

Collapse
No announcement yet.

Schleife um XML auszulesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schleife um XML auszulesen

    Hallo,

    ich möchte mit einer Schleife eine XML-Spalte auslesen.
    Und zwar möchte ich mir jeweils einen Wert (z.B: Kundennummer)in eine Variable schreiben, damit ich diese danach in eine andere Tabelle inserten kann.

    Hab das ganze so gelöst: (für die ersten 10 "Datensätze")

    Code:
    alter procedure getImportXmlData
    as
    begin
    declare @test as varchar(500)
    declare @sKdnr as varchar(500)
    declare @sCustomername as varchar(8000)
    declare @i as decimal(37,0)
    declare @si as varchar(500)
    set @i = 0
    while @i < 10
    begin
    select @sKdnr =   cast(data.query('(/ROWSET/ROW/KD_NR/text())['+ @i+ ']')as varchar(500)) from myxml
    select @sKdnr
    set @i = @i + 1
    end
    end

    bekomme immer den Fehler, dass das erste Argument bei der "query"-Anweisung ein String sein muss.... aber es ist doch einer oder?
    ich mach halt nur de String-addition...
    Wisst ihr wo hier der Fehler liegt? Oder gibt es eine andere möglichkeit?

    MFG


    hirsch

  • #2
    Hallo Hirsch,

    kann ich zwar nicht ausprobieren, aber ad hoc würde ich vermuten, das Du @i auch zu String casten musst, um es "addieren" zu können.

    Olaf.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo,

      leider bringt mir das auch nichts. Auch wenn ich den ganzen String in ne Variable schreib.....

      Comment


      • #4
        Dann will noch einen letzen Rateversuch starten:
        In der Regel erwarten der SQL Server bei solchen Sachen NVarChar.

        select @sKdnr = cast(data.query(N'(/ROWSET/ROW/KD_NR/text())['+ @i+ ']')as nvarchar(500)) from myxml

        Die Variablendefinitionen müsste auch geändert werden.

        Olaf
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Danke für deine schnellen antworten, nur leider hilft auch der Typ NVarChar nichts

          Comment


          • #6
            Hallo,

            wenn die Fehlermeldung "Msg 8172, Level 16, State 1, Line 3
            Das 1-Argument der XML-Datentypmethode "query" muss ein Zeichenfolgenliteral sein." angezeigt wird, bedeutet dies nichts anderes, als das query eine feste Zeichenkette erwartet. Die Fehlermeldung greift daher auf den Begriff Zeichenfolgenliteral zurück. Der folgende Vergleich verdeutlicht dies.

            A) Fehlerhafter Aufruf:

            Code:
            DECLARE @QueryLiteral NVARCHAR(99);
            SET @QueryLiteral = '/Root/Eintrag/wert';
            SELECT recid, wert.query(@QueryLiteral) 
            FROM XmlTbl
            B) Erfolgreicher Aufruf

            Code:
            SELECT recid, wert.query('/Root/Eintrag/wert') 
            FROM XmlTbl

            Comment


            • #7
              Hallo Andreas,

              genau das ist mein Problem.
              Kann ich das "Literal" irgendwie "dynamisch" machen?

              Grüße

              Comment


              • #8
                Hallo,

                in diesem Fall bleibt Dir nichts anderes übrig als den gesamten Befehl dynamisch zusammenzubauen.
                Code:
                alter procedure getImportXmlData
                as
                begin
                	declare @test as varchar(500)
                	declare @sCustomername as varchar(8000)
                	declare @i as decimal(37,0)
                	declare @si as varchar(500)
                	declare @Exec as varchar(max)
                	set @i = 0
                	while @i < 10
                	begin
                		set @Exec = 
                '
                declare @sKdnr as varchar(500)
                select @sKdnr = cast(data.query(''(/ROWSET/ROW/KD_NR/text())['''+ cast(i as varchar(10)) + ']'') as varchar(500)) 
                from myxml
                select @sKdnr
                '
                		print @Exec
                		exec(@Exec)
                
                		set @i = @i + 1
                	end
                end
                Das Ganze ist immer etwas umständlich, aber müsste funktionieren.

                Viele Grüße
                Olaf

                Comment


                • #9
                  hallo olaf!

                  Danke für den Quelltext!! Er funktioniert

                  MFG

                  Hirsch

                  Comment

                  Working...
                  X