none
Datenübergabe Gespeicherte Prozedur RRS feed

  • Frage

  • Hallo Zusammen,

    ich habe ein Problem mit der Datenübergabe oder vielmehr der Syntax bei Datentyp Float.

    USE [SMS_Test] 
    select count(*) as Total from v_ClientCollectionMembers where CollectionID = 'SMS00001' and IsClient=1 
    
    
    BEGIN 
    declare @isLaptop as bit 
    Declare @deviceType as bit 
    Set @deviceType = 0 
    --if @deviceType =2 
    --set @isLaptop = 1 
    --else if @deviceType =0 
    --set @isLaptop = null 
    --else 
    set @isLaptop = 0 
    
     declare @reportStartDate as datetime 
     declare @reportEndDate as datetime 
    
     -- this to get rid of timestamp 
     select @reportEndDate = CAST(FLOOR(CAST(GETDATE() AS float)) AS datetime) 
     
     -- condition is >= start date and < end date 
     set @reportStartDate = DATEADD(Day, -31, @reportEndDate ) 
    
     
    
    EXEC   [dbo].[PowerManagementGetMonthlyReportByDay] 
        @reportStartDate = @reportStartDate, 
        @reportEndDate = @reportEndDate, 
        @collectionId = 'SMS00001', 
        @computerOnDesktop = '0,07' , 
        @computerOnLaptop = '0,02', 
        @computerOffDesktop = '0', 
        @computerOffLaptop = '0', 
        @computerSleepDesktop = '0,003', 
        @computerSleepLaptop = '0,001', 
        @monitorOnDesktop = '0,028', 
        @monitorOnLaptop = '0', 
        @isLaptop = @isLaptop 
    
    end 
    
    
    exec [dbo].[PowerManagementGetMonthlyDailyReportDates] 
    
    
    
    begin 
     
     select v_Collection.CollectionID, v_Collection.Name from v_Collection 
     WHERE v_Collection.CollectionID = 'SMS00001' 
     order by v_Collection.Name 
    end 
    

     

    Normalerweise werden diese Daten in einem Bericht übergeben. Ich muss das ganze aber so umbauen, das es ohne Bericht läuft. Nur das Problem ist, ich bekomme immer die Fehlermeldung beim Convertieren von Varchar in float. Lieht es daran, das wenn eine Kommazahl zwischen zwei ' ' steht (z.B. '0,003') dies dann automatisch als Typ varchar definiert ist?

    Gruß

     

    M.

     

    Dienstag, 2. November 2010 17:36

Antworten

  • Hallo Markus,

    numerische Konstanten werden in SQL ohne Anführungszeichen und mit Dezimalpunkt (nicht -komma) geschrieben.
    Und Zeichenfolgen können nur dann implizit konvertiert werden, siehe CAST / CONVERT

    Übergebe die Zahlen an die Prozedur direkt als Zahl, für oben:

    EXEC  [dbo].[PowerManagementGetMonthlyReportByDay] 
      @reportStartDate = @reportStartDate, 
      @reportEndDate = @reportEndDate, 
      @collectionId = 'SMS00001', 
      @computerOnDesktop = 0,07 , 
      @computerOnLaptop = 0.02, 
      @computerOffDesktop = 0, 
      @computerOffLaptop = 0, 
      @computerSleepDesktop = 0.003, 
      @computerSleepLaptop = 0.001, 
      @monitorOnDesktop = 0.028, 
      @monitorOnLaptop = 0, 
      @isLaptop = @isLaptop 
    
    

    Gruß Elmar

    Dienstag, 2. November 2010 23:34
  • Hallo Elmar,

    Prima Danke, funktuoniert nun. Die augerufene SP gibt ja werte zurück, wie kann ich diese Werte denn ausserhalb der Prozedur z.B. in Decimal convertieren? Z.B. die Prozedur wird ja abgearbeitet und gibt dann den Wert (oder Spalte) "Verbrauch" als Float zurück. Ich möchte die Ausgabe nun aber in dem Format xxxx,xxx als Decimal haben. Das ganze aber ausserhalb der gespeichterten Prozedur, also nach Abarbeitung.

    Gruß

    Markus

     

    Hallo Markus,

    falls die Prozedur nicht geändert werden darf, würde ich Ergebnisse der Prozedur in eine temporäre Tabelle speichern und dann die Werte in einer Abfrage konvertieren.

    use tempdb
    go
    
    create proc [dbo].[PowerManagementGetMonthlyReportByDay]
    	@computerOnDesktop float
    as
    begin
    	select @computerOnDesktop * 2 as Verbrauch
    end
    go
    
    declare @t1 table (Verbrauch float)
    
    insert into @t1
    exec [dbo].[PowerManagementGetMonthlyReportByDay] @computerOnDesktop= 0.3
    select
    	*
    	,CAST(Verbrauch as decimal(15,5)) Verbrauch_as_decimal
    	,replace(CAST(Verbrauch as varchar(15)),'.',',') Verbrauch_as_varchar
    from
    	@t1 
    

     


    Gruß Yury
    • Als Antwort vorgeschlagen Elmar Boye Donnerstag, 4. November 2010 10:23
    • Als Antwort markiert Andrei Talmaciu Donnerstag, 4. November 2010 13:59
    Mittwoch, 3. November 2010 12:00
  • Hallo Markus,

    versuch eine lokale temporäre Tabelle anstatt Tabellenvariable zu nutzen.

    create table #t1(...)
    insert into....
    exec ..........
    select ........
    drop table #t1
    

     


    Gruß Yury
    • Als Antwort vorgeschlagen Elmar Boye Donnerstag, 4. November 2010 10:24
    • Als Antwort markiert Andrei Talmaciu Donnerstag, 4. November 2010 13:59
    Mittwoch, 3. November 2010 14:56

Alle Antworten

  • Hallo Markus,

    numerische Konstanten werden in SQL ohne Anführungszeichen und mit Dezimalpunkt (nicht -komma) geschrieben.
    Und Zeichenfolgen können nur dann implizit konvertiert werden, siehe CAST / CONVERT

    Übergebe die Zahlen an die Prozedur direkt als Zahl, für oben:

    EXEC  [dbo].[PowerManagementGetMonthlyReportByDay] 
      @reportStartDate = @reportStartDate, 
      @reportEndDate = @reportEndDate, 
      @collectionId = 'SMS00001', 
      @computerOnDesktop = 0,07 , 
      @computerOnLaptop = 0.02, 
      @computerOffDesktop = 0, 
      @computerOffLaptop = 0, 
      @computerSleepDesktop = 0.003, 
      @computerSleepLaptop = 0.001, 
      @monitorOnDesktop = 0.028, 
      @monitorOnLaptop = 0, 
      @isLaptop = @isLaptop 
    
    

    Gruß Elmar

    Dienstag, 2. November 2010 23:34
  • Hallo Elmar,

     

    Prima Danke, funktuoniert nun. Die augerufene SP gibt ja werte zurück, wie kann ich diese Werte denn ausserhalb der Prozedur z.B. in Decimal convertieren? Z.B. die Prozedur wird ja abgearbeitet und gibt dann den Wert (oder Spalte) "Verbrauch" als Float zurück. Ich möchte die Ausgabe nun aber in dem Format xxxx,xxx als Decimal haben. Das ganze aber ausserhalb der gespeichterten Prozedur, also nach Abarbeitung.

     

    Gruß

    Markus

     

    Mittwoch, 3. November 2010 09:04
  • Hallo Elmar,

    Prima Danke, funktuoniert nun. Die augerufene SP gibt ja werte zurück, wie kann ich diese Werte denn ausserhalb der Prozedur z.B. in Decimal convertieren? Z.B. die Prozedur wird ja abgearbeitet und gibt dann den Wert (oder Spalte) "Verbrauch" als Float zurück. Ich möchte die Ausgabe nun aber in dem Format xxxx,xxx als Decimal haben. Das ganze aber ausserhalb der gespeichterten Prozedur, also nach Abarbeitung.

    Gruß

    Markus

     

    Hallo Markus,

    falls die Prozedur nicht geändert werden darf, würde ich Ergebnisse der Prozedur in eine temporäre Tabelle speichern und dann die Werte in einer Abfrage konvertieren.

    use tempdb
    go
    
    create proc [dbo].[PowerManagementGetMonthlyReportByDay]
    	@computerOnDesktop float
    as
    begin
    	select @computerOnDesktop * 2 as Verbrauch
    end
    go
    
    declare @t1 table (Verbrauch float)
    
    insert into @t1
    exec [dbo].[PowerManagementGetMonthlyReportByDay] @computerOnDesktop= 0.3
    select
    	*
    	,CAST(Verbrauch as decimal(15,5)) Verbrauch_as_decimal
    	,replace(CAST(Verbrauch as varchar(15)),'.',',') Verbrauch_as_varchar
    from
    	@t1 
    

     


    Gruß Yury
    • Als Antwort vorgeschlagen Elmar Boye Donnerstag, 4. November 2010 10:23
    • Als Antwort markiert Andrei Talmaciu Donnerstag, 4. November 2010 13:59
    Mittwoch, 3. November 2010 12:00
  • Klappt Perfekt so direkt als SQL Query auf dem DB Server...;-) Nur irgendwie wenn ich es remote auf einem Sharepoint ausführe definiert er  @t1 als Query Variable mit Verweis auf eine Tabelle die orhanden sein muss..:-(

    Mein Statement sieht nun wie folgt aus.

    USE [SMS_Test] 
    
    BEGIN 
    Declare @deviceType as bit 
    declare @ignoreCompType as bit 
    Set @deviceType = 0 
    declare @reportStartDate as datetime 
    declare @reportEndDate as datetime 
    
        
      -- this to get rid of timestamp 
      select @reportEndDate = CAST(FLOOR(CAST(GETDATE() AS float)) AS datetime) 
      
      -- condition is >= start date and < end date 
      set @reportStartDate = DATEADD(Day, -31, @reportEndDate ) 
    
        declare @t1 table ([Date]datetime, ComputerOn float, ComputerActive float,MonitorOn float, NumberOfMachines float,ComputerConsumptionPotential float) 
        
        insert into @t1 
    
    EXEC     [dbo].[PowerManagementGetMonthlyReportByDay] 
            @reportStartDate = @reportStartDate, 
            @reportEndDate = @reportEndDate, 
            @collectionId = 'SMS00001', 
            @computerOnDesktop = 0.07, 
            @computerOnLaptop = 0.02, 
            @computerOffDesktop = 0, 
            @computerOffLaptop = 0, 
            @computerSleepDesktop = 0.003, 
            @computerSleepLaptop = 0.001, 
            @monitorOnDesktop = 0.028, 
            @monitorOnLaptop = 0, 
            @ignoreCompType = 1, 
            @isLaptop = 0 
        
    
    
        
            
    
    end 
    
    begin 
     Select [date] 
    
     ,CAST(ComputerConsumptionPotential as decimal(8,2))Consumption_Potential 
     ,CAST(ComputerOn as decimal(8,2))+CAST(MonitorOn as decimal(8,2))Computer_Consumption 
     from @t1 
    
    end
    

     

    Kann man den Tabellen Namen als festen Wert deklarieren, ich denke mal dort ist das Problem.

     

    Gruß

    Markus

     

    Mittwoch, 3. November 2010 12:48
  • Hallo Markus,

    versuch eine lokale temporäre Tabelle anstatt Tabellenvariable zu nutzen.

    create table #t1(...)
    insert into....
    exec ..........
    select ........
    drop table #t1
    

     


    Gruß Yury
    • Als Antwort vorgeschlagen Elmar Boye Donnerstag, 4. November 2010 10:24
    • Als Antwort markiert Andrei Talmaciu Donnerstag, 4. November 2010 13:59
    Mittwoch, 3. November 2010 14:56
  • Hallo Yury,

    kann ich die temporäre Tabelle auch in einer anderen Datenbank erstellen? Ich möchte ungern irgendwelche Änderungen in der bestehenden DB durchführen..

     

    Gruß

     

    Markus

     

     

    Mittwoch, 3. November 2010 15:19
  • Hallo Yury,

    kann ich die temporäre Tabelle auch in einer anderen Datenbank erstellen? Ich möchte ungern irgendwelche Änderungen in der bestehenden DB durchführen..

    Gruß

    Markus

    Hallo Markus,

    eine lokale temporäre Tabelle wird in der Tempdb erstellt und kann nur innerhalb einer Verbindung benutzt werden.


    Gruß Yury
    Mittwoch, 3. November 2010 16:39
  • PERFEKT !!! Läuft nun Prima....;-)

    Vielen Dank nochmal...;-)

    Gruß

    Markus

    Donnerstag, 4. November 2010 08:08
  • Hallo Zusammen,

    ich habe da nochmal eine Frage bezüglich einer Möglichkeit das ganze dynamischer zu gestallten.

    Wie gehe ich denn vor, wenn ich als "@reportStartDate " und "@reportEnddate" eine Benutzereingabe vorraussetzen will als Input...

    Halt eine Art vom Benutzer vorzugebene Variable.

    Gruß

    Markus

     

    Montag, 8. November 2010 10:01
  • Hallo Markus,

    da es sich dabei um eine Variable handelt, kannst Du ihr
    unterschiedliche Werte (hier wohl Datumsangaben) zuweisen.

    Das "Wie" hängt davon ab, wie Du mit dem Benutzer kommunizierst.
    Wo wird das Datum eingegeben und wie wird die Prozedur aufgerufen?

    Gruß Elmar

    Montag, 8. November 2010 13:17
  • Wie gehe ich denn vor, wenn ich als "@reportStartDate " und "@reportEnddate" eine Benutzereingabe vorraussetzen will als Input...

    Hallo Markus,

    wie Elmar geschrieben hat, handelt es sich um Variablen, die hier initialisiert werden:

     -- this to get rid of timestamp 
     select @reportEndDate = CAST(FLOOR(CAST(GETDATE() AS float)) AS datetime) 
     
     -- condition is >= start date and < end date 
     set @reportStartDate = DATEADD(Day, -31, @reportEndDate )

    man kann es z.B. so umschreiben:

     -- this to get rid of timestamp 
     set @reportEndDate = '2010-10-03'
     
     -- condition is >= start date and < end date 
     set @reportStartDate = '2010-09-25'

    Gruß Yury
    Montag, 8. November 2010 19:39
  • Hallo Yury,

     

    ich habe es nun folgendermasen gemacht, die zweite Variable ist der Display text.

    set @reportenddate @ReportEndDay

    set @reportstartdate @ReportStartDay

    Nun habe ich die Möglichkeit diese Variablen mit einem View zu verbinden ( in Sharepoint) was ich nun nur noch brauche ist, das der Rückgabewert formatiert wird. Also nur das das Datum als Variable zurückkommt. Als Datumsformat kommt zb. 01.11.2010 01:00:00. Mit einem Left( xxx, 10) müsste das doch gehen, oder funktionerit das im "set" nicht?

      Muss natürlich im Format YYYY-MM-DD sein..;-)

     

    Gruß

     

    Markus

     

    Dienstag, 9. November 2010 11:38
  • Also nur das das Datum als Variable zurückkommt. Als Datumsformat kommt zb. 01.11.2010 01:00:00. Mit einem Left( xxx, 10) müsste das doch gehen, oder funktionerit das im "set" nicht? Muss natürlich im Format YYYY-MM-DD sein...

    Hallo Markus,

    mehr Info über Konvertierung findest Du unter CAST und CONVERT (Transact-SQL)

    Ich habe hier einen Beispiel vorbereitet:

    ------------------------------------------------------------------------
    --schneidet time ab und speichert Ergebnis als datetime
    ------------------------------------------------------------------------
    declare @sample_value datetime = '01.11.2010 01:00:00'
    declare @report_start_date datetime --!!! datetime
    set @report_start_date = CONVERT(date, @sample_value, 120)
    select @report_start_date
    go
    --result
    --2010-01-11 00:00:00.000
    
    ------------------------------------------------------------------------
    --schneidet time ab und speichert Ergebnis als date
    ------------------------------------------------------------------------
    declare @sample_value datetime = '01.11.2010 01:00:00'
    declare @report_start_date as date --!!! nur date
    set @report_start_date = CONVERT(date, @sample_value, 120)
    select @report_start_date
    go
    --result
    --2010-01-11
    

    Gruß Yury
    Dienstag, 9. November 2010 18:52