Hatte heute ein dummes Problem am SQL-Server 2000:
In einer Stored Procedure sollten Parameter übergeben werden die auch NULL Werte beinhalten können (Keine Eingabe im jeweiligen Suchfeld), allerdings werden diese Parameter in der Where-Clause alle zur Suche benötigt und sind mit AND verknüpft (einschränkende Suche, je mehr angegebene Parameter).
Gut zuerst ganz normal angelegt:
PROCEDURE GetGLAOrdersListbySearchParams
(
@Mandant varchar(3),
@SerivceCustomerNr varchar(10),
@ArticleNr varchar(18),
@SerialNr varchar(30),
@RepairStartFrom smalldatetime,
@RepairStartTo smalldatetime,
@RepairEndFrom smalldatetime,
@RepairEndTo smalldatetime
)
AS
SELECT ID, Mandant, ....(zur besseren Übersicht entfernt)
FROM GLAOrders
WHERE (Mandant = @Mandant) AND (SerivceCustomerNr = @SerivceCustomerNr) AND
(ArticleNr = isnull(@ArticleNr,ArticleNr )) AND
(SerialNr = isnull(@SerialNr,SerialNr)) AND
(ReparaturAnnahme >= isnull(@RepairStartFrom,ReparaturAnnahme)) AND
(ReparaturAnnahme <= isnull(@RepairStartTo,ReparaturAnnahme)) AND
(ReparaturAbschluss >= isnull(@RepairEndFrom,ReparaturAbschluss)) AND
(ReparaturAbschluss <= isnull(@RepairEndTo,ReparaturAbschluss))
So habe ich das bisher gelöst, wenn der Paramter NULL ist wird das Feld mit sich selbst verglichen liefert also true. Leider können in den Datumsfeldern auch NULL-Werte vorkommen, und SQL-Server ist der Meinung dass NULL <= NULL eben nicht gleich ist und lässt diese Sätze dann weg. Nach etwas hin und her folgendes probiert...
... AND
(CASE WHEN @RepairStartFrom IS NULL THEN
isnull(ReparaturAnnahme,1)
ELSE @RepairStartFrom END <= isnull(ReparaturAnnahme,1) ) AND ...
Eben für alle Datumsfelder wie oben und es funktioniert.... vielleicht gibts auch eine bessere oder einfachere Lösung aber so kommt zumindest das gewünschte Ergebnis...
Geschrieben am ,