none
Parameter in DATEADD RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen.

    Ich würde gerne zu folgendem Teil einer Abfrage etwas wissen

    DATEADD(hour, (DATEDIFF(hour, 0, servicechecks.start_time) / @precisionVal) * @precisionVal, 0)

    Das "hour" würde ich gerne durch einen Paramter ersetzen.

    Der Paramter heißt precision, hat den Datentyp String und kann die Werte day, hour und minute annehmen.

    Wenn ich das "hour" nun aber durch @precision ersetze, bekomme ich die Fehlermeldung:

    Could not update a list of fields for the query. Verify that you can connect to the data source and that your query Syntax is correct.
    
    Details:
    Invalid parameter 1 specified for datediff.

    Was mache ich falsch / was muss ich tun damit ich meinen Parameter ion die Abfrage einsetzen kann?

    Im DATEADD habe ich das selbe Problem.

    Ich hoffe ihr könnt mir helfen.

    VIELEN DANK!


    Dienstag, 11. September 2012 10:52

Alle Antworten

  • Hallo,

    du müsstest dann auch dynamisches SQL verwenden. Siehe hierzu auch:

    http://www.insidesql.org/blogs/frankkalis/2004/07/16/dynamisches-sql-fluch-und-segen

    Dies bedutet, dies müsste am Ende in etwa so aussehen:

    DECLARE
    @precision nvarchar(max),
    @sql nvarchar(max)
    SET @precision = 'hour'
    SELECT @sql = 'SELECT DATEADD('+@precision+', (DATEDIFF(hour, 0, servicechecks.start_time) / @precisionVal) * @precisionVal, 0)'
    exec sp_executesql @sql
    
    


    Gruß Falk
    Blog Falk Krahl

    Dienstag, 11. September 2012 11:08
  • Ich verwende die Query in MS Reporting Service.

    Der Wert der Variable precision wird über ein Drop-Down-Menü ausgewählt und die Query dann ausgeführt.

    D.h. ich hab an einer Stelle die Definition von precision

    <QueryParameter Name="@precision">
                <Value>=Parameters!precision.Value</Value>
              </QueryParameter>
    
    [...]
    
    <ReportParameter Name="precision">
          <DataType>String</DataType>
          <Prompt>präzision</Prompt>
          <ValidValues>
            <ParameterValues>
              <ParameterValue>
                <Value>day</Value>
                <Label>täglich</Label>
              </ParameterValue>
              <ParameterValue>
                <Value>hour</Value>
                <Label>stündlich</Label>
              </ParameterValue>
              <ParameterValue>
                <Value>minute</Value>
                <Label>minütlich</Label>
              </ParameterValue>
            </ParameterValues>
          </ValidValues>
        </ReportParameter>

    Und dann meine Query

    <CommandText>SELECT     DATEADD(hour, DATEDIFF(hour, 0, servicechecks.start_time) / @precisionVal * @precisionVal, 0) AS leStunde, AVG(service_cpu.avg_1) AS _avg
    FROM         hosts INNER JOIN
                          services ON hosts.host_object_id = services.host_object_id INNER JOIN
                          servicechecks ON services.service_object_id = servicechecks.service_object_id INNER JOIN
                          service_cpu ON servicechecks.servicecheck_id = service_cpu.servicecheck_id
    WHERE     (hosts.host_object_id = 820) AND (servicechecks.start_time >= @from) AND (servicechecks.end_time <= @to)
    GROUP BY DATEADD(hour, DATEDIFF(hour, 0, servicechecks.start_time) / @precisionVal * @precisionVal, 0)
    ORDER BY leStunde</CommandText>

    Wie funktioniert die Lösung hier genau?

    Wenn ich precision in der Query einen Wert zuweise wird der vorher über das Drop-Down-Menü ausgewählte Wert doch überschrieben, oder?

    Davon abgesehen lässt mich der Editor wie gesagt das "hour" garnicht durch @precision ersetzen.


    • Bearbeitet leMarvin91 Dienstag, 11. September 2012 13:00 falsche query
    Dienstag, 11. September 2012 12:59
  • Hallo!
    Bearbeite die Abfrage als Text und verwende das SQL von Falk. Dann sollte es gehen.

    Nur die graphische Oberfläche lässt so etwas nicht zu, ansonsten kannst Du in der Abfrage allerhand anstellen, was Du sonst auch im Management Studio machen würdest.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Donnerstag, 13. September 2012 12:22
    Beantworter
  • Hallo,

    ich glaube ich kann dir helfen.

    ="SELECT     DATEADD(hour, DATEDIFF(hour, 0, servicechecks.start_time) / " & Parameters!precision.Value & " * " & Parameters!precision.Value & ", 0) AS leStunde, AVG(service_cpu.avg_1) AS _avg
    FROM         hosts INNER JOIN
                          services ON hosts.host_object_id = services.host_object_id INNER JOIN
                          servicechecks ON services.service_object_id = servicechecks.service_object_id INNER JOIN
                          service_cpu ON servicechecks.servicecheck_id = service_cpu.servicecheck_id
    WHERE     (hosts.host_object_id = 820) AND (servicechecks.start_time >= @from) AND (servicechecks.end_time <= @to)
    GROUP BY DATEADD(hour, DATEDIFF(hour, 0, servicechecks.start_time) / " & Parameters!precision.Value & " * " & Parameters!precision.Value & ", 0)
    ORDER BY leStunde"

    Falls du noch mehr Variablen hast ersetze diese durch " & Parameters!VARIABLE.Value & " .

    So füge ich die Variablen immer ein. Wichtig ist =" am Anfang und " am Ende. Möglich das du hinter jeder Zeile ein Leerzeichen einfügen musst, weil Befehle sonst als ein Text erkannt werden. (z.B.:  service_cpu.servicecheck_idWHERE) Ich programmiere diese Sachen meist im Visual Studio.




    Freitag, 14. September 2012 15:10