Stored procedures 请帮助我将SP转换为动态sql查询,或转换为使用COALESCE且运行正常的SP
我有一个当前格式的SP不能正常工作,它不会返回所有的行,当我包含一些值时,也不会返回任何值。 以下是SP:Stored procedures 请帮助我将SP转换为动态sql查询,或转换为使用COALESCE且运行正常的SP,stored-procedures,dynamic-sql,sql,Stored Procedures,Dynamic Sql,Sql,我有一个当前格式的SP不能正常工作,它不会返回所有的行,当我包含一些值时,也不会返回任何值。 以下是SP: 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 nvarc
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
我尝试了一些使用COALESCE的方法,但是COALESCE似乎对INT不起作用,至少在我的SP中不起作用,每当我有COALESCE和INT值时,SP都不会返回任何值。
以下是带有合并的SP:
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
我真的很想看到这个查询工作,我最大的问题是订单状态。网站可能会发送多个选择,我需要合并所有选择并过滤结果。
我真的希望有人能帮助我修复这个SP或使用动态查询。
非常感谢。鉴于您的问题似乎过于复杂:-
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 = 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))
然而,由于所有@variables都设置为null,这只是一种复杂的说法
AND o.OrderStatusID = o.OrderStatusID
和o.OrderTotal>COALESCE@MinimumOrderAmount,o.OrderTotal将永远不会适用于@MinimumOrderAmount为空。从逻辑上讲,o.OrderTotal>o.OrderTotal永远不会是真的。对于回复,你知道我如何解决这个问题吗?查询底部的多重选择是真正的问题,我可以解决订单金额问题。谢谢