2010-11-19 4 views
0

Ich habe eine SP, die im aktuellen Format nicht richtig funktioniert, es gibt nicht alle Zeilen und wenn ich einige einschließe Werte geben keine Werte zurück. Hier ist die SP:bitte helfen Sie mir, SP zu dynamischen SQL-Abfrage oder zu SP, die COALESCE verwendet und es läuft OK

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[AdvancedSearch] 
(
@StartTime datetime = null, 
@EndTime datetime = null, 
@CustomerEmail nvarchar(255) = null, 
@Username nvarchar(255) = null, 
@CustomerName nvarchar(255) = null, 
@OrderNumber int = null, 
@MinimumOrderAmount decimal = null, 
@MaximumOrderAmount decimal = null, 
@ShippingMethod nvarchar(255) = null, 
@SKU nvarchar(255) = null, 
@CouponID int = null, 
@DiscountType int = null, 
@ShippingCountryID int = null, 
@UserRegistration nvarchar(255) = null, 
@OrderStatusPending int = null, 
@OrderStatusProcessing int = null, 
@OrderStatusComplete int = null, 
@OrderStatusCancelled int = null, 
@OrderStatusCancelledDiscontinued int = null, 
@OrderStatusCancelledCustomerRequest int = null, 
@OrderStatusCancelledPendingNeverPaid int = null 
    ) 
    AS 
    BEGIN 
    SET NOCOUNT ON 

    SELECT DISTINCT o.OrderID, o.OrderTotal, n.Name AS OrderStatus, p.Name AS PaymentStatus, s.Name AS ShippingStatus, o.BillingFirstName + ' ' + o.BillingLastName AS CustomerName, o.CreatedOn AS CreatedOn FROM Nop_Order o 
    LEFT OUTER JOIN StatusOrders n ON o.OrderStatusID = n.OrderStatusID 
    LEFT OUTER JOIN StatusPayments p ON o.PaymentStatusID = p.PaymentStatusID 
    LEFT OUTER JOIN ShippingStatus s ON o.ShippingStatusID = s.ShippingStatusID 
    LEFT OUTER JOIN Customer c ON o.CustomerID = c.CustomerID 
    LEFT OUTER JOIN Discount d ON o.DiscountID = d.DiscountID 
    LEFT OUTER JOIN OrderProductionVariable opv ON o.OrderID = opv.OrderID 
    LEFT OUTER JOIN ProductionVariations pv ON opv.ProductVariantID = pv.ProductVariantId 
    WHERE (o.CreatedOn > @StartTime OR @StartTime IS NULL) 
    AND (o.CreatedOn < @EndTime OR @EndTime IS NULL) 
    AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL) 
    AND (o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @OrderStatusID IS NULL) 
    AND (o.PaymentStatusID IN (@PaymentStatusID) OR @PaymentStatusID IS NULL) 
    AND (c.Username = @Username OR @Username IS NULL) 
    AND (o.BillingFirstName + ' ' + o.BillingLastName = @CustomerName OR @CustomerName IS NULL) 
    AND (o.ShippingFirstName + ' ' + o.ShippingLastName = @CustomerName OR @CustomerName IS NULL) 
    AND (o.OrderID = @OrderNumber OR @OrderNumber IS NULL) 
    AND (o.OrderTotal > @MinimumOrderAmount or @MinimumOrderAmount IS NULL) 
    AND (o.OrderTotal < @MaximumOrderAmount OR @MaximumOrderAmount IS NULL) 
    AND (o.ShippingMethod = @ShippingMethod OR @ShippingMethod IS NULL) 
    AND (d.DiscountTypeID = @DiscountType OR @DiscountType IS NULL) 
    AND (o.ShippingCountryID = @ShippingCountryID OR @ShippingCountryID IS NULL) 
    AND (o.DiscountID = @CouponID OR @CouponID IS NULL) 
    AND (pv.SKU = @SKU OR @SKU IS NULL) 
    AND (c.Email = @UserRegistration OR @UserRegistration IS NULL) 
    AND (o.Deleted = 0) 
AND (o.OrderStatusID = @OrderStatusPending OR o.OrderStatusID = @OrderStatusProcessing OR o.OrderStatusID = @OrderStatusComplete OR o.OrderStatusID = @OrderStatusCancelled OR o.OrderStatusID = @OrderStatusCancelledDiscontinued 
OR o.OrderStatusID = @OrderStatusCancelledCustomerRequest OR o.OrderStatusID = @OrderStatusCancelledPendingNeverPaid) 
    ORDER BY o.OrderID  
    END 

Ich habe versucht, etwas mit COALESCE stattdessen aber COALESCE nicht scheint mit INT zu arbeiten, zumindest nicht in meinem SP, wenn ich COALESCE und int-Wert haben, hat die SP nicht einen beliebigen Wert zurückgeben. Hier ist die SP mit COALESCE ist:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[AdvancedSearch] 
(
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null, 
    @Username nvarchar(255) = null, 
    @CustomerName nvarchar(255) = null, 
    @OrderNumber int = null, 
    @MinimumOrderAmount decimal = null, 
    @MaximumOrderAmount decimal = null, 
    @ShippingMethod nvarchar(255) = null, 
    @SKU nvarchar(255) = null, 
    @CouponID int = null, 
    @DiscountType int = null, 
    @ShippingCountryID int = null, 
    @UserRegistration nvarchar(255) = null, 
    @OrderStatusPending int = null, 
    @OrderStatusProcessing int = null, 
    @OrderStatusComplete int = null, 
    @OrderStatusCancelled int = null, 
    @OrderStatusCancelledDiscontinued int = null, 
    @OrderStatusCancelledCustomerRequest int = null, 
    @OrderStatusCancelledPendingNeverPaid int = null 
    ) 
    AS 
    BEGIN 
    SET NOCOUNT ON 

    SELECT DISTINCT o.OrderID, o.OrderTotal, n.Name AS OrderStatus, p.Name AS PaymentStatus, s.Name AS ShippingStatus, o.BillingFirstName + ' ' + o.BillingLastName AS CustomerName, o.CreatedOn AS CreatedOn FROM Nop_Order o 
     LEFT OUTER JOIN StatusOrders n ON o.OrderStatusID = n.OrderStatusID 
    LEFT OUTER JOIN StatusPayments p ON o.PaymentStatusID = p.PaymentStatusID 
    LEFT OUTER JOIN ShippingStatus s ON o.ShippingStatusID = s.ShippingStatusID 
    LEFT OUTER JOIN Customer c ON o.CustomerID = c.CustomerID 
    LEFT OUTER JOIN Discount d ON o.DiscountID = d.DiscountID 
    LEFT OUTER JOIN OrderProductionVariable opv ON o.OrderID = opv.OrderID 
    LEFT OUTER JOIN ProductionVariations pv ON opv.ProductVariantID = pv.ProductVariantId 
    WHERE (o.CreatedOn > COALESCE(@StartTime, '01-01-1899')) 
    AND (o.CreatedOn < COALESCE(@EndTime, '01-01-2099')) 
    AND (o.ShippingEmail = COALESCE(@CustomerEmail, o.ShippingEmail)) 
    AND (c.Username = COALESCE(@Username, c.Username)) 
    AND (o.BillingFirstName + ' ' + o.BillingLastName = COALESCE(@CustomerName, o.BillingFirstName + ' ' + o.BillingLastName)) 
    AND (o.ShippingFirstName + ' ' + o.ShippingLastName = COALESCE(@CustomerName, o.ShippingFirstName + ' ' + o.ShippingLastName)) 
    AND (o.OrderID = COALESCE(@OrderNumber, o.OrderID)) 
    AND (o.OrderTotal > COALESCE(@MinimumOrderAmount, o.OrderTotal)) 
    AND (o.OrderTotal < COALESCE(@MaximumOrderAmount, o.OrderTotal)) 
    AND (o.ShippingMethod = COALESCE(@ShippingMethod, o.ShippingMethod)) 
    AND (d.DiscountTypeID = COALESCE(@DiscountType, d.DiscountTypeID)) 
    AND (o.ShippingCountryID = COALESCE(@ShippingCountryID, o.ShippingCountryID)) 
    AND (o.DiscountID = COALESCE(@CouponID, O.DiscountID)) 
    AND (pv.SKU = COALESCE(@SKU, pv.SKU)) 
    AND (c.Email = COALESCE(@UserRegistration, c.Email)) 
    AND (o.Deleted = 0) 
    AND(o.OrderStatusID = 
    COALESCE(@OrderStatusPending, o.OrderStatusID) 
    | COALESCE(@OrderStatusProcessing, o.OrderStatusID) 
    | COALESCE(@OrderStatusComplete, o.OrderStatusID) 
    | COALESCE(@OrderStatusCancelled, o.OrderStatusID) 
    | COALESCE(@OrderStatusCancelledCustomerRequest, o.OrderStatusID) 
    | COALESCE(@OrderStatusCancelledDiscontinued, o.OrderStatusID) 
    | COALESCE(@OrderStatusCancelledPendingNeverPaid, o.OrderStatusID)) 
    ORDER BY o.OrderID 

    END 

ich wirklich diese Abfrage Arbeits sehen wollen würde, das größte Problem, das ich habe, ist mit dem Auftragsstatus. Es könnte mehrere Auswahlen von der Website gesendet werden, und ich muss alle von ihnen zusammenführen und die Ergebnisse filtern. Ich hoffe wirklich, dass jemand mir helfen kann, entweder etwas von diesem SP oder mit dynamischer Abfrage zu beheben. Vielen Dank.

+0

* UND (o.OrderTotal> COALESCE (@MinimumOrderAmount, o.OrderTotal)) * zu sagen, wird nie w ork für @MinimumOrderAmount IST NULL. Logisch o.OrderTotal> o.OrderTotal wird ** NIEMALS ** wahr sein –

+0

thx für die Antwort, hast du eine Idee wie ich das Problem lösen kann? Die multiple Auswahl am unteren Ende der Abfrage ist das eigentliche Problem, ich kann das Bestellbetrag Problem beheben. Danke – Laziale

Antwort

0

Apert aus der über Komplikation Ihr Problem in zu sein scheint: -

AND(o.OrderStatusID = 
    COALESCE(@OrderStatusPending, o.OrderStatusID) 
| COALESCE(@OrderStatusProcessing, o.OrderStatusID) 
| COALESCE(@OrderStatusComplete, o.OrderStatusID) 
| COALESCE(@OrderStatusCancelled, o.OrderStatusID) 
| COALESCE(@OrderStatusCancelledCustomerRequest, o.OrderStatusID) 
| COALESCE(@OrderStatusCancelledDiscontinued, o.OrderStatusID) 
| COALESCE(@OrderStatusCancelledPendingNeverPaid, o.OrderStatusID)) 

es so etwas wie sollte lauten:

gesetzt
AND (o.OrderStatusID = COALESCE(@OrderStatusPending, o.OrderStatusID) 
or o.OrderStatusID =COALESCE(@OrderStatusProcessing, o.OrderStatusID) 
or o.OrderStatusID =COALESCE(@OrderStatusComplete, o.OrderStatusID) 
or o.OrderStatusID =COALESCE(@OrderStatusCancelled, o.OrderStatusID) 
or o.OrderStatusID =COALESCE(@OrderStatusCancelledCustomerRequest, o.OrderStatusID) 
or o.OrderStatusID =COALESCE(@OrderStatusCancelledDiscontinued, o.OrderStatusID) 
or o.OrderStatusID =COALESCE(@OrderStatusCancelledPendingNeverPaid, o.OrderStatusID)) 

Howver als alle Ihre @ Variablen diese auf null ist nur eine komplexe Art und Weise

AND o.OrderStatusID = o.OrderStatusID 
+0

mit OR wirft einen Fehler aus, wenn ich mit Koaleszieren verwende – Laziale