SQL Server 2008 - как получить записи с определенным диапазоном идентификаторов - PullRequest
0 голосов
/ 11 августа 2010

В 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

Ответы [ 3 ]

2 голосов
/ 11 августа 2010

По сути, вы передаете список значений для использования фильтра на уровне строк

Авторитетная, вездесущая и часто цитируемая статья : "Массивы и список в SQL Server"

0 голосов
/ 11 августа 2010

Передать переменную таблицы в качестве параметра

0 голосов
/ 11 августа 2010

Я видел это раньше, вызывая функцию для преобразования строки результатов в таблицу.Затем вы можете присоединить таблицу к вашему запросу, чтобы ограничить результаты.

Кажется, здесь есть пример для этого: https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=375

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...