Я хочу сделать, я думаю, запрос UNION ALL
, чтобы я мог вернуть результаты из своей таблицы заказов на основе идентификатора производителя, введенного в поле поиска. Упорядочить ссылки на> OrderItem, который затем можно связать с Product.
Я вручную набрал запрос, и он работает, но у меня возникают проблемы с его условием в моей хранимой процедуре.
Вот запрос, который я набрал вручную:
SELECT TOP 100 *
FROM [Test].[dbo].[Order] o
LEFT JOIN [Test].[dbo].[OrderItem] oi ON oi.[OrderId] = o.[Id]
LEFT JOIN [Test].[dbo].[Product] p ON p.[Id] = oi.[ProductId]
WHERE p.[ManufacturerId] = 'mid'
Вот моя хранимая процедура:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[OrderLoadAllPaged]
@OrderId INT = 0,
@CustomerId INT = 0,
@ProductId INT = 0,
@WarehouseId INT = 0,
@BillingCountryId INT = 0,
@PaymentMethodSystemName NVARCHAR(MAX) = NULL,
@OrderStatusId INT = 0,
@PaymentStatusId INT = 0,
@ShippingStatusId INT = 0,
@BillingEmail NVARCHAR(MAX) = NULL,
@BillingFirstName NVARCHAR(MAX) = NULL,
@BillingLastName NVARCHAR(MAX) = NULL,
@ManCode NVARCHAR(MAX) = NULL,
@Current BIT = NULL,
@ShippingMethod NVARCHAR(MAX) = NULL,
@CreatedFromUtc DATETIME = NULL,
@CreatedToUtc DATETIME = NULL,
@PageIndex INT = 0,
@PageSize INT = 2147483644,
@TotalRecords INT = NULL OUTPUT
AS
BEGIN
DECLARE @sql NVARCHAR(MAX)
SET NOCOUNT ON;
CREATE TABLE #TempTotal (RowNum INT IDENTITY(1,1), id INT);
CREATE INDEX #IK_temp ON #TempTotal (RowNum);
INSERT INTO #TempTotal ([id])
SELECT o.[Id]
FROM [Test].[dbo].[Order] o WITH (NOLOCK)
LEFT JOIN [Test].[dbo].[Address] a ON a.Id = o.BillingAddressId
AND (COALESCE(@BillingEmail, '') <> ''
OR COALESCE(@BillingFirstName, '') <> ''
OR COALESCE(@BillingLastName, '') <> '')
/* LEFT JOIN [Test].[dbo].[OrderItem] oi ON oi.OrderId = o.Id
AND (COALESCE(@ManCode,'') <> '')
LEFT join [Test].[dbo].[Product] p ON p.Id = oi.ProductId
AND (COALESCE(@ManCode, '') <> '')*/
WHERE (@BillingEmail IS NULL OR a.[Email] = @BillingEmail)
AND (@BillingFirstName IS NULL OR a.[FirstName] = @BillingFirstName)
AND (@BillingLastName IS NULL OR a.[LastName] = @BillingLastName)
-- AND (@ManCode IS NULL OR p.[ManufacturerId] = @ManCode)
UNION ALL
(SELECT *
FROM [Test].[dbo].[Product] p
LEFT JOIN [Test].[dbo].[OrderItem] oi ON oi.[OrderId] = o.[Id]
LEFT JOIN [Test].[dbo].[Product] p ON p.[Id] = oi.[ProductId]
WHERE (@ManCode IS NULL OR p.[ManufacturerId] = @ManCode))
AND -- here is error
o.[Deleted] = 0
AND (o.[Id] = @OrderId OR @OrderId = 0)
AND (o.[CustomerId] = @CustomerId OR @CustomerId = 0)
AND (o.[WarehouseId] = @WarehouseId OR @WarehouseId = 0)
AND (@PaymentMethodSystemName IS NULL OR o.[PaymentMethodSystemName] = @PaymentMethodSystemName)
AND (o.[OrderStatusId] = @OrderStatusId OR @OrderStatusId = 0)
AND (o.[PaymentStatusId] = @PaymentStatusId OR @PaymentStatusId = 0)
AND (o.[ShippingStatusId] = @ShippingStatusId OR @ShippingStatusId = 0)
AND ((o.[OrderStatusId] != '40' AND o.[OrderStatusId] != '30' AND ((o.[ShippingStatusId] != '30' OR o.[ShippingStatusId] != '40') AND o.[Printed] = '0' AND (o.[PaymentStatusId] != '30' OR o.[PaymentStatusId] != '35' OR o.[PaymentStatusId] != '40'))) OR @Current = 0)
AND o.[CreatedOnUtc] >= ISNULL(@CreatedFromUtc, '1/1/1900')
AND o.[CreatedOnUtc] < ISNULL(@CreatedToUtc, '1/1/2999')
ORDER BY
o.[CreatedOnUtc] DESC;
--paging
DECLARE @PageLowerBound INT
SET @PageLowerBound = @PageSize * @PageIndex
-- Return the paged records
SELECT
[Id], [OrderGuid], [StoreId], [CustomerId],
[BillingAddressId], [ShippingAddressId],
[OrderStatusId], [ShippingStatusId],
[PaymentStatusId], [PaymentMethodSystemName],
[TaxRates], [OrderTax], [OrderDiscount], [OrderTotal],
[ShippingMethod], [CustomValuesXml], [Deleted],
[CreatedOnUtc], [EditedStatusId],
[WarehouseId], [PrintedOnUtc]
FROM
[Test].[dbo].[Order] ord
WHERE
ord.[Id] IN (SELECT id FROM #TempTotal tt)
ORDER BY
ord.[CreatedOnUtc] DESC
OFFSET @PageLowerBound ROWS FETCH NEXT @PageSize ROWS ONLY;
--total records
SELECT @TotalRecords = COUNT(*) FROM #TempTotal;
DROP TABLE #TempTotal
END
Я не уверен, что мне нужен UNION ALL
, но я чувствую, чтоэто. Я также попробовал левые соединения, которые были закомментированы, но безуспешно.
Также здесь приведен скриншот ошибки в операторе AND.
Кто-нибудь может мне здесь помочь?