2010-11-19 10 views
0

Geçerli biçiminde düzgün çalışmayan bir SP var, tüm satırları döndürmüyor ve bazı eklendiğinde değerler hiçbir değer döndürmez. İşte SP: Ben yerine COALESCE ile bir şeyler denediklütfen bana yardım için dinamik sql sorgu veya SPALESCE kullanan SP dönüştürmek yardımcı olur ve ok çalışıyor

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 

ama COALESCE ben COALESCE ve int değerine sahip olduğunda, SP değil, en azından benim SP, INT çalışmak gibi görünüyor değil herhangi bir değer döndür. İşte COALESCE ile SP geçerli:

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 

Gerçekten bu sorgu çalışma görmek isteyeyim, ben en büyük sorun sipariş durumunuzu olduğunu. Web sitesinden gönderilen birden çok seçim olabilir ve bunların hepsini birleştirip sonuçları filtrelemem gerekiyor. Gerçekten bu SP'in bazılarını ya da dinamik sorgulamayla düzeltmemde bana yardımcı olabileceğini umuyorum. Çok teşekkürler.

Sorununuz gibi görünüyor üzerinde komplikasyon gelen
+0

* vE (o.OrderTotal> COALESCE (@MinimumOrderAmount, o.OrderTotal)) * söyleyerek karmaşık bir yolu asla w olacak @MinimumOrderAmount IS NULL için ork. Mantıksal o.OrderToplam> o.OrderTotal ** ** NEVER ** cevabın doğru olması için –

+0

thx olacak, sorunu nasıl çözebilirim? Sorgunun altındaki çoklu seçim gerçek bir sorundur, ben sipariş miktarı problemi düzeltebilirim. – Laziale

cevap

0

Apert: -: Tüm @ değişkenler sıfır olarak ayarlanır olarak

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 bu sadece gibi bir şey okumalısınız

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)) 

AND o.OrderStatusID = o.OrderStatusID 
+0

OR kullanarak coalesce kullanırken bir hata atar – Laziale

İlgili konular