none
SSRS Dataset aus SP keine Feldliste RRS feed

  • Frage

  • Hallo Forum,

    habe bei meiner Suche leider nichts passendes gefunden.

    Ich habe im Managment Studio eine Abfrage erstellt welche mit temporären Tebellen arbeitet.
    Diese Abfrage möchte ich als StoredProcedure im SSRS verwenden.
    Im SSRS erhalte ich aber keine Feldliste. Habe es auch schon versucht am Anfang der SP eine If sektion einzubauen
    welche nie aufgerufen wird und darin eine Select anweisung zu machen. Leider ohne Erfolg.

    Wie ist in diesem Fall vorzugehen ?

    Bin für jeden Tipp dankbar.

    Gruß Frank

    Sonntag, 17. Januar 2016 18:01

Antworten

  • Hallo an alle,

    es funktioniert. Alle Felder sind da.

    Habe in der letzten Select Anweisung zweimal auf eine Spalte verwiesen.
    Nachdem ich dies per Zufall gefunden und in der SP geändert habe, geht's auch im ReportBuilder.

    Trotzdem ein danke für die Unterstützung.

    Gruß

    Frank

    • Als Antwort markiert Fralbers Dienstag, 19. Januar 2016 19:16
    Dienstag, 19. Januar 2016 19:16

Alle Antworten

  • Hallo Frank,

    ich nutzte für unsere Bericht immer Stored Procedures als Quell für die Datasets und das funktioniert bestens; gibt es Änderungen an der Business Logik, muss ich nur die SP anpassen, aber nicht den (die) Bericht(e).

    Als Einschränkung gilt aber, das die SP nur einen Recordset zurück liefern darf, nicht mehrere. So sollte man auch immer SET NOCOUNT ON am Anfang der SP gesetzt werden, damit keine unnötigen InfoMessages geliefert werden, die Feldnamen müssen eindeutig sein, etc.

    Wie sieht Deine SP von der Struktur her aus?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 18. Januar 2016 07:54
  • Hallo Olaf,

    hier der code der sp. Was ist mit Rückgabe von nur einem Recordset gemeint ?

    USE [DB_KAHAINE]
    GO
    
    /****** Object:  StoredProcedure [dbo].[usp_Tageswerte]    Script Date: 18.01.2016 09:03:40 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    -- =============================================
    -- Author:		Frank ALbers
    -- Create date: 2016-01-16
    -- Description:	Tageswerte aufbereiten
    -- =============================================
    CREATE PROCEDURE [dbo].[usp_Tageswerte]
    	-- Add the parameters for the stored procedure here
    	@Tag int = 1,
    	@Variablenname varchar(80) = 'ST%_Istwert%'
    
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
    /****************************************/
    /****** Aufbereiten der Tageswerte ******/
    /****************************************/
    -- benutze temporäre tabellen für ablage der zwischen ergebnisse
    --use tempdb;
    --go
    
    
    Declare @Test int = 1;
    If @Test = 0 
    BEGIN
    -- ist nur dummy um in view feldvariablen zu bekommen
    SELECT	CAST(tw.dt as date) as Datum,det.TagDescription AS Bezeichnung,
    		det.Units AS Dim ,
    		mima.MinValue, 
    		mima.MinTime, 
    		mima.MaxValue, 
    		mima.MaxTime,
    		AVG(tw.Value) AS Mittelwert,
    		zwstd.[0-2], zwstd.[2-4], zwstd.[4-6], zwstd.[6-8], zwstd.[8-10], zwstd.[10-12], zwstd.[12-14],
    		zwstd.[12-14], zwstd.[14-16], zwstd.[16-18], zwstd.[18-20], zwstd.[20-22], zwstd.[22-24]
    FROM #tmpMiMaTim AS mima  
    	join DB_KAHAINE.dbo.Adr_DBLog_AgentDetails AS det --agent details
    	ON mima.Tagname = det.TagName
    	join #tmpDayValue AS tw -- day values
    	ON mima.Tagname = tw.Tagname
    	join #tmpZweiStd as zwstd -- two hour values
    	on mima.Tagname = zwstd.Tagname
    GROUP BY CAST(tw.dt as date),det.TagDescription,mima.Tagname,
    		det.Units,
    		mima.MinValue, 
    		mima.MinTime, 
    		mima.MaxValue, 
    		mima.MaxTime, 
    		zwstd.[0-2], zwstd.[2-4], zwstd.[4-6], zwstd.[6-8], zwstd.[8-10], zwstd.[10-12], zwstd.[12-14],
    		zwstd.[12-14], zwstd.[14-16], zwstd.[16-18], zwstd.[18-20], zwstd.[20-22], zwstd.[22-24]
    ORDER BY det.TagDescription	;
    
    END
    --GO
    
    
    -- zu beginn temp tabellen löschen, wenn vorhanden 
    -- temp tabelle für tageswerte
    IF OBJECT_ID (N'#tmpDayValue',N'U') IS NOT NULL
    DROP TABLE #tmpDayValue;
    print 'TagesWerte Tabelle glöscht';
    --go
    -- temp tabelle für min-max-zeit tageswerte
    IF OBJECT_ID (N'#tmpMiMaTim',N'U') IS NOT NULL
    DROP TABLE #tmpMiMaTim;
    print 'MiMaTim Tabelle glöscht';
    --go
    
    IF OBJECT_ID (N'#tmpZweiStd',N'U') IS NOT NULL
    DROP TABLE #tmpZweiStd;
    print 'ZweiStd Tabelle glöscht';
    --go
    
    
    -- Abfrage Datum-Tag zum suchen im script, ist nur für entwicklung und test
    /*
    declare @Tag as int = 9
    declare @Variablenname as varchar(80) = 'ST%_Istwert%'
    */
    print 'Suche nach ' + @variablenname;
    
    -- werte suchen und mit stdunden nummer in temp tabelle speichern
    SELECT id,dt,Tagname, Value , 
    	  case -- stundennummer filtern 
    	  	when (datepart(hour,dt) < 2) then 1
    		when (datepart(hour,dt) < 4) then 2
    		when (datepart(hour,dt) < 6) then 3
    		when (datepart(hour,dt) < 8) then 4
    		when (datepart(hour,dt) < 10) then 5
    		when (datepart(hour,dt) < 12) then 6
    		when (datepart(hour,dt) < 14) then 7
    		when (datepart(hour,dt) < 16) then 8
    		when (datepart(hour,dt) < 18) then 9
    		when (datepart(hour,dt) < 20) then 10
    		when (datepart(hour,dt) < 22) then 11
    		when (datepart(hour,dt) < 24) then 12
    	end as StdNum
    	into #tmpDayValue
      FROM [DB_KAHAINE].[dbo].[Messwerte]
    where Tagname like @Variablenname and DATEPART(day,dt) = @Tag ;
    print 'TagesWerte Tabelle gefüllt';
    --go
    
    
    -- Suche zu jedem Wert den Min mit Zeit und Max mit Zeit
    WITH 
    Query AS
    	(
    	SELECT   Tagname,
    			 MIN( Value ) AS MinValue,
    			 MAX( Value ) AS MaxValue
    	FROM     #tmpDayValue
    	GROUP BY Tagname
    	),
    MinValuesQuery AS
    	(
    	SELECT   m.Tagname,
    			 q.MinValue,
    			 MIN( dt ) AS MinDt
    	FROM     #tmpDayValue m
    			 INNER JOIN Query q ON m.Tagname = q.Tagname AND m.Value = q.MinValue
    	GROUP BY m.Tagname,
    			 q.MinValue
    	),
    MaxValuesQuery AS
    	(
    	SELECT   m.Tagname,
    			 q.MaxValue,
    			 Min( dt ) AS MaxDt
    	FROM     #tmpDayValue m
    			 INNER JOIN Query q ON m.Tagname = q.Tagname AND m.Value = q.MaxValue
    	GROUP BY m.Tagname,
    			 q.MaxValue
    	)
    SELECT minvq.Tagname,
           minvq.MinValue,
           Cast(minvq.MinDt as time(0) ) as MinTime,
           maxvq.MaxValue,
           Cast(maxvq.MaxDt as time(0) ) as MaxTime
    INTO #tmpMiMaTim -- temporäre tabelle 
    FROM   MinValuesQuery minvq
           CROSS JOIN MaxValuesQuery maxvq
    WHERE  minvq.Tagname = maxvq.Tagname
    ORDER BY Tagname ;
    --go
    print 'Min-Max-Zeit Werte';
    --go 
    
    -- zwei Stunden Werte als tabelle ausgeben // Überschriften sind fix als Spaltennamen enthalten
    SELECT Tagname ,
    	 [1] AS '0-2' ,[2] AS '2-4',[3] AS '4-6',[4] AS '6-8',[5] AS '8-10',[6] AS '10-12',
    	 [7] AS '12-14',[8] AS '14-16',[9] AS '16-18' ,[10] AS '18-20',[11] AS '20-22',[12] AS '22-24'
    into #tmpZweiStd
      FROM 
      (SELECT Tagname, Value, StdNum
      FROM #tmpDayValue) AS p
      PIVOT
      (
      AVG(Value)
      FOR StdNum IN
      ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] )
      ) AS pvt
      ORDER BY Tagname;
    --go
    print 'Zwei Stunden Werte';
    --go
    
    -- abfrage mit Details aus agent details
    SELECT	CAST(tw.dt as date) as Datum,det.TagDescription AS Bezeichnung,
    		det.Units AS Dim ,
    		mima.MinValue, 
    		mima.MinTime, 
    		mima.MaxValue, 
    		mima.MaxTime,
    		AVG(tw.Value) AS Mittelwert,
    		zwstd.[0-2], zwstd.[2-4], zwstd.[4-6], zwstd.[6-8], zwstd.[8-10], zwstd.[10-12], zwstd.[12-14],
    		zwstd.[12-14], zwstd.[14-16], zwstd.[16-18], zwstd.[18-20], zwstd.[20-22], zwstd.[22-24]
    FROM #tmpMiMaTim AS mima  
    	join DB_KAHAINE.dbo.Adr_DBLog_AgentDetails AS det --agent details
    	ON mima.Tagname = det.TagName
    	join #tmpDayValue AS tw -- day values
    	ON mima.Tagname = tw.Tagname
    	join #tmpZweiStd as zwstd -- two hour values
    	on mima.Tagname = zwstd.Tagname
    GROUP BY CAST(tw.dt as date),det.TagDescription,mima.Tagname,
    		det.Units,
    		mima.MinValue, 
    		mima.MinTime, 
    		mima.MaxValue, 
    		mima.MaxTime, 
    		zwstd.[0-2], zwstd.[2-4], zwstd.[4-6], zwstd.[6-8], zwstd.[8-10], zwstd.[10-12], zwstd.[12-14],
    		zwstd.[12-14], zwstd.[14-16], zwstd.[16-18], zwstd.[18-20], zwstd.[20-22], zwstd.[22-24]
    ORDER BY det.TagDescription	;
    --go
    
    
    
    
    END
    
    
    GO
    
    

    Gruß

    Frank


    • Bearbeitet Fralbers Dienstag, 19. Januar 2016 19:18 fehler im code siehe bold/underline
    Montag, 18. Januar 2016 08:06
  • Hallo Frank,
    ich kenne das Phänomen auch. Ich behelfe mir in der Regel damit, dass ich am Anfang das korrekte Select-Statement in der Prozedur aufführe, es aber nie ausführen lasse:

    If 1 = 0
         Select ...

    Anscheinend kann das Visual Studio in komplexeren Prozeduren nicht korrekt ermitteln, wie das Result-Set aussehen wird.

    HTH!

    Einen schönen Tag noch,
    Christoph
    --
    Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Montag, 18. Januar 2016 08:35
    Beantworter
  • Hallo Christoph,

    danke für den Hinweis. Den habe ich schon in einem anderen Beitrag gelesen und auch in meinem Code implementiert.

    Leider funktioniert es bei mir nicht.

    Gruß

    Frank

    Montag, 18. Januar 2016 08:38
  • Ich kenne den Fall von SSIS, das rum jammert, wenn eine SP kein Resultset liefert, weil die SP nur eine einfach DML Aktion durchführt. Da behelfe ich mir damit, das ich die RESULT SET NONE Anweiung von EXECUTE (Transact-SQL) - WITH Klausel angebe. Umgekehrt kann man auch explizit definieren, wie das Resultset aussieht; siehe Link unter Beispiel "M. Using EXECUTE to redefine a single result set"

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 18. Januar 2016 08:59
  • Hallo Olaf,

    wo mache ich denn den Aufruf ?
    Im Query Designer des ReportBuilders?

    Gibt es nicht einen einfacheren Weg das Ergebnis der Abfrage, welche in der SP habe,
    als Dataset zu nutzen und als Report auszugeben ?

    Gruß

    Frank

    Montag, 18. Januar 2016 09:54
  • Hallo Frank,
    verwendest Du den Report Builder?

    Schon mal probiert das im Visual Studio (SQL Server Data Tools) zu machen?

    Dort kannst Du auf jeden Fall beim Dataset auf die Eigenschaften gehen und die Felder explizit angeben.

    Einen schönen Tag noch,
    Christoph
    --
    Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Montag, 18. Januar 2016 14:38
    Beantworter
  • Hallo Christoph,

    ja ich arbeite mit dem Report Builder. Werde mir das Visual Studio mal anschauen.

    Ist es Möglich meine SP so umzuschreiben das ich als Parameter aus dem Report Builder das Datum übergebe
    und mir die SP eine View mit den entsprechenden Daten füllt ? Der Gedanke dabei ist, das ich mir dann eine View
    definiere mit den entsprechenden Feldern welche ich im Report Builder dann verarbeite und über die SP nur noch die Daten aktualisiere.
    Geht das ?

    Gruß

    Frank

    Montag, 18. Januar 2016 16:22
  • Hallo Frank,

    eine View ist eine vordefinierte Abfrage auf Tabellen oder anderen Views; die kann man nicht per Stored Procedure befüllen.

    Versuch doch mal das, was Christoph vorgeschlagen hat, nämlich die Feldnamen in den Dataset Eigenschaften manuell anzugeben. Mit dieser (unsinnigen) Abfrage ohne Feldnamen funktioniert es immerhin mit dem ersten Feld "Test1"


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 19. Januar 2016 07:02
  • Hi Olaf,

    nein, geht nicht , ich bekomme keine Felder angezeigt.
    Kann es sein das an den Temporären Tabellen liegt ?

    Ist es denn Möglich aus dem Report Builder eine SP aufzurufen und dieser ein Datum zu übergeben
    um dann mit dem Result der SP eine Tabelle zu füllen auf deren Felder dann im Report zugegriffen wird ?

    Gruß

    Frank


    • Bearbeitet Fralbers Dienstag, 19. Januar 2016 18:17
    Dienstag, 19. Januar 2016 18:06
  • Hallo an alle,

    es funktioniert. Alle Felder sind da.

    Habe in der letzten Select Anweisung zweimal auf eine Spalte verwiesen.
    Nachdem ich dies per Zufall gefunden und in der SP geändert habe, geht's auch im ReportBuilder.

    Trotzdem ein danke für die Unterstützung.

    Gruß

    Frank

    • Als Antwort markiert Fralbers Dienstag, 19. Januar 2016 19:16
    Dienstag, 19. Januar 2016 19:16