Fragensteller
Parameter in DATEADD

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!
- Bearbeitet leMarvin91 Dienstag, 11. September 2012 10:56 query war falsch
- Typ geändert Raul TalmaciuMicrosoft contingent staff Dienstag, 18. September 2012 10:00 Warten auf Feedback
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
-
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
-
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 -
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.
- Bearbeitet ReportBuilder Montag, 17. September 2012 13:19
-
Hallo,
bist Du inzwischen weitergekommen?
Gruss,
RaulRaul Talmaciu, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.