В SQL Server 2008 я хотел бы создать хранимую процедуру для выбора конкретных продуктов, передавая их идентификаторы в качестве аргумента.
Но я намерен привести в результате ряд продуктов.
Этот диапазон должен иметь значение аргумента информированного productIds (например: 1 и 8 и 29 - это означает, что диапазон ДОЛЖЕН иметь productId 1 и productId 8 и productId 29).
Нежелательные диапазоны (например, productId 1 и productId 8, productId 1 и productId 29, productId 8 и productId 29) не будут отображаться в результате.
Как я могу отфильтроватьэти нежелательные диапазоны из моего запроса?
CREATE PROCEDURE [dbo].[ListProduct]
(
@categoryId
@productIds VARCHAR(4000) --Suppose we want to bring ONLY productIds 1 AND 8 AND 29
)
AS
BEGIN
SELECT
category_id,
product_id,
product_name,
FROM Product
WHERE category_id = @category_id
AND productId = --... is it better to use a function? a cursor?
END
Если у нас есть
CategoryId 1
ProductId 2
ProductId 8
ProductId 20
ProductId 29
CategoryId 2
ProductId 1
ProductId 3
ProductId 20
ProductId 29
CategoryId 3
ProductId 1
ProductId 8
ProductId 20
ProductId 29
Результат будет
CategoryId 1 | ProductId 1
CategoryId 1 | ProductId 8
CategoryId 1 | ProductId 29
CategoryId 3 | ProductId 1
CategoryId 3 | ProductId 8
CategoryId 3 | ProductId 29
Вот что я получил такfar:
CREATE TABLE #mylist(product_id int NOT NULL PRIMARY KEY)
INSERT #mylist
SELECT Value FROM dbo.fn_split('1,8,29',',')
SELECT category_id,product_id
FROM Product
WHERE product_id IN (SELECT product_id FROM #mylist)
Но, когда отсутствует идентификатор продукта, например, 8, этот запрос показывает:
CategoryId 1 | ProductId 1
CategoryId 1 | ProductId 8
CategoryId 1 | ProductId 29
CategoryId 2 | ProductId 1 --category2 should not be displayed,
CategoryId 2 | ProductId 29 -- because product id 8 is missing....
CategoryId 3 | ProductId 1
CategoryId 3 | ProductId 8
CategoryId 3 | ProductId 29