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
* 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 –
thx olacak, sorunu nasıl çözebilirim? Sorgunun altındaki çoklu seçim gerçek bir sorundur, ben sipariş miktarı problemi düzeltebilirim. – Laziale