在SQL Server 2008中,我想创建一个存储过程来选择特定产品,并将其ID作为参数传递。
但我打算带来一系列产品。
此范围必须具有明确的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
这是我到目前为止所得到的:
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)
但是,当产品ID缺失为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
答案 0 :(得分:2)
基本上,您传递的是值列表以使用行级过滤器
权威,无所不在且经常引用的文章:"Arrays and List in SQL Server"
答案 1 :(得分:0)
我之前通过调用一个函数将productids的字符串转换为表来看到它。然后,您可以将表连接到查询中以限制结果。
这里似乎有一个例子: https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=375
答案 2 :(得分:0)
将表变量作为参数传递