none
Unterschiedliche XML Namespaces in der SSRS Datenbank RRS feed

  • Frage

  • Derzeit migrieren wir eine alte SSRS 2005-Umgebung nach SSRS 2014. Da wir unsere Berichte thematisch neu strukturieren wollen, haben wir neue Projekte angelegt und wir importieren die alten RDL-Dateien in diese Projekte und veröffentlichen diese. In den meisten Fällen hat das ohne Probleme funktioniert, und in ein paar Fällen mussten wir geringe Anpassungen vornehmen.

    Einige unserer Berichte betreffen die SSRS Umgebung selbst, und wir fragen den XML-Inhalt der Tabelle dbo.Catalog.Content ab. Jetzt haben wir das Problem, dass nach der Migration die alten Berichte aus irgendeinem Grund unterschiedliche XML-Namespaces verwenden.
    Das sieht dann wie folgt aus:

    WITH x AS

    ( SELECT

         CatContent = CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content))),

         CIndex     = CHARINDEX('xmlns="',CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content))))

      FROM Reportserver.dbo.Catalog C

      WHERE C.Content IS NOT NULL

     AND C.Type  = 2

    )

    SELECT

       SUBSTRING(x.CatContent,x.CIndex,CHARINDEX('"',x.CatContent,x.CIndex+11) - x.CIndex) XMLNamespace,

       COUNT(*) how_often

    FROM x

    GROUP BY SUBSTRING(x.CatContent,x.CIndex,CHARINDEX('"',x.CatContent,x.CIndex+11) - x.CIndex)


    XMLNamespace                                                                      how_often

    xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition       34

    xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition      247

    xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition        3

    Wie man sieht werden in einer SSRS Datenbank parallel die XML Namespaces 2005, 2008 und 2010 verwendet. Jetzt funktionieren meine alten Abfragen nicht mehr und mir ist auch nicht klar, wie ich die Abfragen anpassen muss. Eine vereinfachte Abfrage wie diese

    WITH

    XMLNAMESPACES

    ( DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition',

              'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' as rd

    ),

    a AS

    (

     SELECT

         CONVERT(XML,CONVERT(VARBINARY(MAX),Content)) AS reportXML

     FROM ReportServer.dbo.Catalog WITH (NOLOCK)

     WHERE content IS NOT NULL

     AND type != 3

    ),

    b AS

    ( SELECT

         x.value('Author[1]'   ,'VARCHAR(500)') AS Author

      FROM a

      CROSS APPLY reportXML.nodes('/Report') r(x)

    )

    SELECT Author, COUNT(*) how_often FROM b GROUP BY Author

    Author       how_often

                        1

    Peter               7

    Thomas             12

    Susanne            14

    gibt mir nur die 34 Autoren die mit einem 2005er XML-Schema in der Datenbank stehen. Ich kann zwar die 2005 in der Abfrage gegen 2008 oder 2010 austauschen um die übrigen Autoren zu erhalten aber ich möchte gerne alle Autoren in einer Abfrage ermitteln. Ich habe versucht, mehrere Werte in den WITH XMLNAMESPACES Bereich zu schreiben aber damit hatte ich keinen Erfolg.

    Im obigen Fall wäre es natürlich möglich die gewünscht Information mit folgender Abfrage zu erhalten:

    WITH x AS

    ( SELECT

         CatContent = CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content))),

         CIndex     = CHARINDEX('Author',CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content))))

      FROM Reportserver.dbo.Catalog C

      WHERE C.Content is not null

      AND C.Type  = 2

    )

    SELECT

       CASE WHEN x.CIndex > 0 THEN

            CASE WHEN CHARINDEX('<',x.CatContent,x.CIndex+7) > 0

                 THEN SUBSTRING(x.CatContent,x.CIndex+7,CHARINDEX('<',x.CatContent,x.CIndex+7) - x.CIndex-7)

                 ELSE '' END

            ELSE '' END Author,

        COUNT(*) how_often

             FROM x

    GROUP BY CASE WHEN x.CIndex > 0 THEN

            CASE WHEN CHARINDEX('<',x.CatContent,x.CIndex+7) > 0

                 THEN SUBSTRING(x.CatContent,x.CIndex+7,CHARINDEX('<',x.CatContent,x.CIndex+7) - x.CIndex-7)

                 ELSE '' END

            ELSE '' END

    aber das kann ja nicht die generelle Lösung sein. Deshalb meine Fragen:

    -       Ist es möglich mehere XML Namespaces in einer Abfrage zu verwenden?

    -       Warum liegen meine Report-Definitionen jetzt in unterschiedlichen Namespaces vor?

    -       Oder gibt es einen einfachen Weg, alle Reporte in das gleiche XML-Schema zu migrieren?

    Freitag, 26. September 2014 12:57

Antworten

  • Die ReportServer Datenbank ist nicht dokumentiert, somit sind direkte Abfragen auf die Tabellen auch in keiner Weise supported und geschieht damit "auf eigene Gefahr". Und bei Versionswechsel kann es nun mal sein, das Microsoft Internitas geändert hat, was dazu führt, das eigene Abfragen nicht mehr funktionieren.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert uwdn Montag, 6. Oktober 2014 06:35
    Montag, 29. September 2014 13:48

Alle Antworten

  • Hallo,

    ja, man kann mehrere Namespaces angeben, machst Du ja schon in Deiner 2ten Anfrage. Nur kann man nur einmal ein DEFAULT Namespace definieren und benannte Namespaces wie "rd" müssen eindeutig sein; hilft hier also nicht weiter.

    Wenn man eine Inplace Migration durchführt, werden vorhandene Berichte beim ersten Aufruf automatisch migriert, von daher wurden die 34 Berichte mit 2005 noch nicht geöffnet. Bei SSRS 2012 war es so, das die Berichte auf 2008 migriert und mit 2010 waren Berichte, die über den "Report Builder" neu erstellt wurden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 26. September 2014 13:30
  • Danke für die Antwort. Wenn ich die 34 Reports, die noch im 2005er Schema sind, einmal im Visual Studio öffne, dann werden sie in der Tat nach 2008 migriert. Aber dann habe ich am Ende aber leider noch immer das Problem, dass ich 2008 und 2010 gemischt habe. Kann man vielleicht in einem UNION zwei XML Namespaces kombinieren? Wie müsste die Syntax dann lauten?
    Freitag, 26. September 2014 13:48
  • Hallo,

    Du kannst die XML Schemas nur qualifizieren nicht jedoch kombinieren.

    Ein XML Schema muss man sich wie ein Schema in SQL vorstellen. Es dürfen gleiche Elemente enthalten sein, die im Aufbau unterschiedlich sind. Und das ist bei den RDL Schemas der Fall. Die Schemata wurden von Version zu Version fortgeschrieben. Und so findet man elementare Dinge wie ein TextBoxType in allen, die späteren enthalten neu eingeführte Elemente und ggf. Anpassungen für bereits bestehende. Und auch wenn z. B. TextBoxType das gleiche in allen beschreibt, so sind es für das XML Schema zwei unterschiedliche, die nur durch die Qualifizierung unterscheidbar sind.

    Welche Unterschiede im einzelnen bestehen, ist bei der Größe der Schemata schwer zu sagen - man sie unter der Adresse im Web abrufen. Die "Migration", die die Designer vornehmen, passt abweichende Teile an und tauscht das Schema aus, so dass es nur ein (Standard) Schema gibt. Der einzig offizielle Weg wäre der über die Designer, wie Olaf es beschrieben hat.[1]

    Am Ende hängt es davon ab, welche Teile in den Berichten vorgekommen. Deswegen denkbar, jedoch ohne Gewährleistung, kann man versuchen, ob man alle Definitionen auf das aktuelle Schema (2010) umstellen kann. Die Alternative ist, alle Elemente mit dem verwendeten Schema zu qualifizieren - was sehr mühselig sein dürfte.

    Gruß Elmar

    [1] Denkbar wäre eine Migration über XSL, was eine kleinere Mammut Aufgabe sein dürfte, wenn das nicht bereits jemand getan hat - ich habe nicht danach gesucht.

    Sonntag, 28. September 2014 08:12
  • Ich habe jetzt die Schemata 2008 und 2010 verglichen und herausgefunden, dass ich die migrierten Reporte relativ einfach in das 2010er-Schema zwingen kann, indem ich bei den Berichtseigenschaften immer etwas bei "InitialPageName" eintrage. Dieses Property ist erst im XML-Schema 2010 neu hinzugekommen. Der dort eingetragene Wert wird z.B. beim Excel-Export für die Benennung der Tabellenblätter bzw. des ersten Tabellenblatts verwendet. Jetzt muss ich zwar alle Reporte nochmal anpacken und neu veröffentlichen, aber der Aufwand ist bei unserer Menge von Berichten noch überschaubar. In meinen Augen ist es aber ein Bug, dass beim Veröffentlichen nicht alle Reports die gleiche Schema-Version erhalten und alte Abfragen auf die XML-Daten der Reports dann nicht mehr funktionieren und auch nicht angepasst werden können.
    Montag, 29. September 2014 12:58
  • Die ReportServer Datenbank ist nicht dokumentiert, somit sind direkte Abfragen auf die Tabellen auch in keiner Weise supported und geschieht damit "auf eigene Gefahr". Und bei Versionswechsel kann es nun mal sein, das Microsoft Internitas geändert hat, was dazu führt, das eigene Abfragen nicht mehr funktionieren.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert uwdn Montag, 6. Oktober 2014 06:35
    Montag, 29. September 2014 13:48
  • Als Ergänzung hier noch der MSDN Artikel zu Upgrade Reports

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 30. September 2014 06:49
  • Danke für die Hinweise. Wie oben geschrieben, habe ich einen Weg gefunden, alle Reports in das gleiche XML-Schema zu bringen, so dass meine alten Abfragen auf die Reporting Services Datenbank weiterhin funktionieren. Auch wenn das, was ich mache von Microsoft nicht offiziell "supported" ist, finde ich es schon seltsam, dass beim automatischen Konvertieren nicht alle Reports direkt in das neuste Schema gebracht werden.
    Montag, 6. Oktober 2014 06:41