SQL Server 2008 - 如何获取具有特定ID范围的记录

时间:2010-08-11 17:31:52

标签: arrays sql-server-2008 range

在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

3 个答案:

答案 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)

将表变量作为参数传递