Anna85: XML Datei zeigt nicht das richtige Ergebnis

Hallo und guten Morgen, ich baue grade eine xml, die Daten kommen aus mssql Server. Ich bekomme zwar Ergebnis, aber nicht so wie gewünscht. Meine fertige xml Datei soll so aussehen:

 <v1:farbe id="11" type="l">
    <v1:artikels>
      <v1:artikel>A bis Z</v1:artikel>
    </v1:artikels>
    
    <zusaetze>
      <zusatz xmlns:v1="test.de" xmlns:commons="v3.test" logicalName="gruppe" key="050" />
      
      
    </zusaetze>
  </v1:farbe>

aber es sieht so aus:

 <v1:farbe id="11" type="l">
    <v1:artikels>
      <v1:artikel>A bis Z</v1:artikel>
    </v1:artikels>
    
    <zusaetze>
      <zusatz xmlns:v1="test.de" xmlns:commons="v3.test" logicalName="gruppe" key="050" />
      <zusatz xmlns:v1="test.de" xmlns:commons="v3.test" logicalName="gruppe" key="030" />
     <zusatz xmlns:v1="test.de" xmlns:commons="v3.test" logicalName="gruppe" key="020" />
      
    </zusaetze>
  </v1:farbe>

Meine Abfrage ist so:

WITH XMLNAMESPACES (
'xmlns:v1="test.de"' as commons,
'xmlns:commons="v3.test" ' as v1)


 Select tab.id as '@id',
	'zusatz' as '@type',
	        titel1 as 'v1:zusaetze/v1:zusatz',
			
		 
  
  ,(
   Select 
    'DDC_Sachgruppen' as '@logicalName'
    ,gruppe as '@key' 
	
     from tab
	 	 order by tab.id
			 offset 0 rows
			 fetch next 3 row only

		FOR XML PATH('zusatz'), TYPE
  ) as zusaetze
 FROM [zdb_import2]

 order by tab.id
 offset 0 rows
 fetch next 3 
 row only

 FOR XML PATH('v1:farbe'), ROOT('v1:farben')

Ich möchte einfach nur erste 3 Datensätze holen aus der Datenbank. An sich holt mir die Abfrage 3 Datensätze, aber jedes mal mit 3 gleichen Zusätze, was falsch ist. Zu jede Datensatz ist ein Zusatz. Wie kann ich meine Abfrage korrigieren?

Vielen Dank im Voraus für jede Antwort!

  1. Hallo,

    zu deinem Problem kann ich im Moment leider nichts beitragen, aber ich habe mal dein Posting repariert.

    Ciao,
     Martin

    --
    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
  2. Hi,

     Select tab.id as '@id',
    	'zusatz' as '@type',
    	        titel1 as 'v1:zusaetze/v1:zusatz',
      ,(
       Select 
        'DDC_Sachgruppen' as '@logicalName'
        ,gruppe as '@key' 
    	
         from tab
    	 	 order by tab.id
    			 offset 0 rows
    			 fetch next 3 row only
    
    		FOR XML PATH('zusatz'), TYPE
      ) as zusaetze
     FROM [zdb_import2]
    

    Dein innerer Select hat keinerlei Abhängigkeit vom äußeren Select, also holt er für jeden Record des äußeren selects die gleichen 3 Records des inneren.

    Statt der unrelated subquery müßtest Du vermutlich eine correlated subquery verwenden - evtl. auch einen join.

    Aber ohne Kenntnis des Tabellenaufbaus ist das schwer zu sagen.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo, das ist nur eine Tabelle. Die Daten hole ich nun aus eine Tabelle.

      Deshalb habe ich gedacht, es ist einfach. Ich hole mir nur der Artkel und der Zusatz dazu. Das Problem ist nur, dass der Zusatz einen container braucht, der "gruppe" heisst. Also die xml muss einfach so aussehen:

       <v1:farbe id="11" type="l">
          <v1:artikels>
            <v1:artikel>A bis Z</v1:artikel>
          </v1:artikels>
          <zusaetze>
            <zusatz xmlns:v1="test.de" xmlns:commons="v3.test" logicalName="gruppe" key="050" />
                 
          </zusaetze>
        </v1:farbe>
      

      Und ich weiß, dass man das mit @ einbaut, aber kriege ich nicht hin. Ich werde dankbar für eine Antwort!

    2. Ich habe jetzt so versucht:

      Select tab.id as '@id',
      	'zusatz' as '@type',
      	        titel1 as 'v1:zusaetze/v1:zusatz'
        where exists(
         Select 
          'DDC_Sachgruppen' as '@logicalName'
          ,gruppe as '@key' 
      	
           from tab
      	 	 order by tab.id
      			 offset 0 rows
      			 fetch next 3 row only
      
      		FOR XML PATH('zusatz'), TYPE
        ) as zusaetze
       FROM [zdb_import2]
      

      Dann bekomme ich keine Zusätze im Ergebnis