2017-01-04 4 views
0

Ich baue derzeit eine Reihe von Protokollierungs- und Analyse-Tools, um unsere SQL-Umgebung im Auge zu behalten. Wir verwenden derzeit SQL Server 2014.SSRS-Bericht Parameter übergeben

Was ich tun möchte, ist die Überprüfung aller Parameter, die während des Tages an unsere Berichte übergeben werden. Alle Berichte verwenden derzeit gespeicherte Prozeduren, sodass in meiner Tabelle oder einer SELECT-Anweisung, die auf einer Tabelle basiert, die gespeicherte Prozedur mit den Parametern für jedes Mal ausgegeben wird, wenn der Bericht ausgeführt wurde.

Am Ende des Tages möchte ich dann in der Lage sein, die ausgegebene Anweisung zu nehmen und es in SSMS laufen zu lassen, ohne den Bericht zu verwenden. Ich habe mir die ExcelutionLogStorage-Tabelle und die ExecutionLog-Ansicht angesehen und obwohl sie die meisten Informationen enthält, die ich brauche, sind die Parameter nicht in einem leicht verwendbaren Zustand.

Hat jemand etwas ähnliches getan, was ich beschrieben habe?

Antwort

0

Sie müssen die Protokollierung an Ihrem ursprünglichen SP hinzuzufügen, zum Beispiel:

Alter procedure a 
(@parameter) 
As 
Begin 
.. 
.. 
Insert into loggingTable(col) 
Values(@parameter) 
.. 
.. 
End 

Dann direkt abfragen gegen diese loggingTable für das Erhalten der Geschichte der verwendeten Parameter

+0

Dies setzt voraus, dass die Stored Procedures immer nur durch Reportausführung aufgerufen werden –

+0

Hallo Long, danke für die Antwort, es ist sehr beschwerlich, alle Parameter ein zweites Mal neu aufzeichnen zu müssen, wenn sie schon gespeichert sind die ExecutionLogStorage-Tabelle, auch wenn sie nicht in dem am einfachsten zu verwendenden Format vorliegen. Ich habe auch viele viele gespeicherte Prozeduren, die ich diesen Beispielcode hinzufügen würde, zu dem beträchtliche Zeit benötigen würde. – PJD

+0

Hoffe, das wird Ihnen in Ihrem Fall helfen: http://jegansubramaniam.blogspot.com/2012/02/ssrs-method-to-retrieve-last-run-report.html – LONG

0

Eine Google-Suche, um dieses Thema schnell gebracht up die folgenden blog post bereits identifiziert von der OP als nützlich und unten gezeigt (diese Abfrage selbst ist eigentlich eine Erweiterung der Arbeit mit LONGs Antwort unten verbunden)

SELECT TOP 1 ParValue 
    FROM (
    SELECT els.TimeEnd 
     , IIF(CHARINDEX('&' + 'ParameterName' + '=', ParsString) = 0, 'ParameterName', 
     SUBSTRING(ParsString 
      , StartIndex 
      , CHARINDEX('&', ParsString, StartIndex) - StartIndex)) AS ParValue 
     FROM (SELECT ReportID, TimeEnd 
      , '&' + CONVERT(VARCHAR(MAX), Parameters) + '&' AS ParsString 
      , CHARINDEX('&' + 'ParameterName' + '=', '&' + CONVERT(VARCHAR(MAX), Parameters) + '&') 
       + LEN('&' + 'ParameterName' + '=') AS StartIndex 
      FROM ExecutionLogStorage 
      WHERE UserName='UserName' -- e.g. DOMAIN\Joe_Smith 
     ) AS els 
     INNER JOIN [Catalog] AS c ON c.ItemID = els.ReportID 
     WHERE c.Name = 'ReportName' 
    UNION ALL 
    SELECT CAST('2000-01-01' AS DateTime), 'ParameterName' 
) i 
    ORDER BY TimeEnd DESC; 

Beide Ansätze bieten uns jedoch nur einen Ausgangspunkt, da sie sich (auf verschiedene Weise) darauf verlassen, dass wir den Namen und die Parameternamen des Berichts im Voraus kennen. Wir können zwar schnell einige Änderungen an Ken Bowmans Arbeit vornehmen, um es gegen alle Ausführungen aller Berichte laufen zu lassen, aber wir haben immer noch das Problem, dass die Abfrage den Parameternamen fest codiert.

Die für die Ausführung eines Berichts erforderlichen Parameter werden in der Tabelle Catalog in der Spalte Parameter gespeichert. Obwohl die Spalte den Datentyp ntext hat, speichert sie tatsächlich eine XML-Zeichenfolge. an den Parameternamen Bedeutung können wir eine XPath Abfrage benutzen Sie

with 
CatalogData as (
    select ItemID, [Path], [Name], cast(Parameter as xml) 'ParameterXml' 
    from Catalog 
    where [Type] = 2), 
ReportParameters as (
    select ItemID, [Path], [Name], ParameterXml, p.value('Name[1]', 'nvarchar(256)') 'ParameterName' 
    from CatalogData 
    cross apply ParameterXml.nodes('/Parameters/Parameter') as Parameters(p)) 
select * 
from ReportParameters; 

diese Abfrage ausgeführt werden alle Berichte auf dem Server und deren Parameter aufzulisten. Jetzt müssen wir das nur mit Ken Bowmans Anfrage kombinieren. Ich habe

with 
CatalogData as (
    select ItemID, [Path], [Name], cast(Parameter as xml) 'ParameterXml' 
    from Catalog 
    where [Type] = 2), 
ReportParameters as (
    select ItemID, [Path], [Name], p.value('Name[1]', 'nvarchar(256)') 'ParameterName' 
    from CatalogData 
    cross apply ParameterXml.nodes('/Parameters/Parameter') as Parameters(p)) 
select 
    els.TimeEnd 
    , c.[Name] 
    , rp.ParameterName 
    , iif(
     charindex(
      '&' + rp.ParameterName + '=', ParametersString) = 0 
      , rp.ParameterName, substring(ParametersString 
      , StartIndex, charindex('&', ParametersString, StartIndex) - StartIndex 
    )) 'ParameterValue' 
from (
    select 
     ReportID 
     , TimeEnd 
     , rp.ParameterName 
     , '&' + convert(varchar(max), Parameters) + '&' 'ParametersString' 
     , charindex(
      '&' + rp.ParameterName + '=', 
      '&' + convert(varchar(max), Parameters) + '&' 
     ) + len('&' + rp.ParameterName + '=') 'StartIndex' 
    from 
    ExecutionLogStorage 
    inner join ReportParameters rp on rp.ItemID = ReportID) AS els 
inner join [Catalog] c on c.ItemID = els.ReportID 
inner join ReportParameters rp on rp.ItemID = c.ItemID and rp.ParameterName = els.ParameterName; 

Hinweis mit einem WAK Ansatz gegangen, dass die Parameterwerte auf den Bericht als Teil einer URL übergeben werden, so dass Sie immer noch loswerden müssen erhalten die wörtliche Raum Codierung und so weiter. Auch dies funktioniert (noch) nicht für mehrwertige Parameter.

+0

Hallo Paul, danke für die Antwort, tat ich Auf meinen Reisen bin ich auf diesen Code gestoßen und habe versucht, ihn auszuführen, bekomme aber nur wenig zurück. Ich habe die where-Klausel entfernt, um alles aus meiner ExecutionLogStorage abzurufen, aber immer eine Spalte namens ParValue mit einem Datensatzwert von ParameterName zurück.Gibt es noch etwas, was ich tun muss, um das zu schaffen? Jede andere Hilfe wäre großartig! – PJD

+0

Abfrage wie angegeben ist für die letzte Ausführung eines einzelnen Berichts. Um alle Berichte/Ausführungen zu erhalten, entfernen Sie die "SELECT TOP 1 ParValue FROM (" und dann alles nach der "WHERE c.Name ..." - Klausel. Sie würden wahrscheinlich auch die UserName where-Klausel entfernen. Natürlich sind wir Die Parameter können in jedem Bericht gefunden werden. Diese können die Parameter-Spalte der Catalog-Tabelle finden. Obwohl Ntext seine eigentliche XML kann so abgefragt werden. –

+0

Es ist ein ruhiger Morgen (Mitarbeiter/Studenten nicht zurück bis nächste Woche!) und Interesse geweckt, so bin ich ein wenig weiter gegangen.Siehe meine überarbeitete Antwort für eine Lösung –