2010-04-30 5 views
0

У меня есть запрос, который работает:SQL Четкая ключевое слово в операторе присваивания

DECLARE @ProductID int 
SET @ProductID = '1234' 

SELECT DISTINCT TOP 12 a.ProductID 
FROM A a 
WHERE a.CategoryID IN (SELECT b.CategoryID FROM B b WHERE b.ProductID = @ProductID) 
AND a.ProductID != @ProductID 

возвращает список из 12 номеров продукции, все уникальные.

Мне нужно сохранить эти результаты в переменной, разделенной запятой, потому что это то, что требуется сторонней хранимой процедуре. Поэтому у меня есть следующее:

DECLARE @ProductID int 
DECLARE @relatedprods varchar(8000) 
SET @ProductID = '1234' 
SET @relatedprods = '' 

SELECT TOP 12 @relatedprods = @relatedprods + CONVERT(VARCHAR(20), a.ProductID) + ', ' 
    FROM A a 
    WHERE a.CategoryID IN (SELECT b.CategoryID FROM B b WHERE B.ProductID = @ProductID) 
    AND a.ProductID != @ProductID 

SELECT @relatedprods 

Теперь ни один из них не отличается, но он возвращает 12 строк.

Теперь я добавляю «отчетливый» обратно, как и в первом запросе:

DECLARE @ProductID int 
DECLARE @relatedprods varchar(8000) 
SET @ProductID = '1234' 
SET @relatedprods = '' 

SELECT DISTINCT TOP 12 @relatedprods = @relatedprods + CONVERT(VARCHAR(20), a.ProductID) + ', ' 
    FROM A a 
    WHERE a.CategoryID IN (SELECT b.CategoryID FROM B b WHERE B.ProductID = @ProductID) 
    AND a.ProductID != @ProductID 

SELECT @relatedprods 

только один продукт возвращается в разделенный запятыми список! «Различий» не работает в операторах присваивания? Что я сделал не так? Или есть способ обойти это?

Заранее благодарен!

ВЫВОД:

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

DECLARE @ProductID int 
DECLARE @relatedprods varchar(8000) 
SET @ProductID = '1234' 
SET @relatedprods = '' 

SELECT @relatedprods = @relatedprods + CONVERT(VARCHAR(20), c.ProductID) + ',' 
    FROM (SELECT DISTINCT TOP 12 a.ProductID FROM A a WHERE a.CategoryID IN 
     (SELECT b.CategoryID 
     FROM B b 
     WHERE B.ProductID = @ProductID) 
    AND a.ProductID != @ProductID) c 

SET @relatedprods = SUBSTRING(@relatedprods, 0, LEN(@relatedprods)) 
SELECT @relatedprods 
+0

@Brandi - Какая версия SQL Server? – Thomas

+0

@Thomas - SQL Server 2008 – Brandi

ответ

1

Получите 12 записей в подзапросе:

declare 
    @ProductID int, 
    @relatedprods varchar(8000) 

set @ProductID = '1234' 
set @relatedprods = '' 

select @relatedprods = @relatedprods + cast(ProductID as varchar) + ',' 
from (
    select distinct top 12 a.ProductId 
    from A a 
    inner join B b on b.CategoryID = a.CategoryID 
    where B.ProductID = @ProductID and a.ProductID != @ProductID 
) x 
+0

Версия этого закончила работать для меня, спасибо! – Brandi

0

Вы могли бы использовать временную таблицу?

DECLARE @relatedProdList TABLE (prod VARCHAR(20)) 
INSERT INTO @relatedProdList 
SELECT DISTINCT TOP 12 CONVERT(VARCHAR(20), a.ProductID) 
FROM A a 
WHERE a.CategoryID IN (SELECT b.CategoryID FROM B b WHERE b.ProductID = @ProductID) 
AND a.ProductID != @ProductID 

SELECT @relatedprods = @relatedprods + prod + ', ' 
FROM @relatedProdList 
0

Это просто дикое предположение, но я ожидаю, что делает назначение в SELECT терпит неудачу с DISTINCT, так как он должен делать вид после генерации значение столбца (ов) для обеспечения четкости. Я видел подобное поведение при добавлении нетривиального предложения ORDER BY (например, упорядочение по выражению).

Если у вас есть SQL Server 2005 или выше, вы также можете использовать FOR XML PATH.

DECLARE @ProductID int 
DECLARE @relatedprods varchar(8000) 
SET @ProductID = 1234 

SET @relatedprods = (SELECT DISTINCT TOP 12 
    CONVERT(VARCHAR(20), a.ProductID) + ',' 
    FROM A a 
    WHERE a.CategoryID IN (...) 
    AND a.ProductID != @ProductID 
    FOR XML PATH('')) 

-- FOR XML PATH will add an extra comma at the end, so remove it. 
IF LEN(@relatedProds) > 1 
    SET @relatedProds = SUBSTRING(@relatedProds, 1, LEN(@relatedProds) - 1) 

Поскольку вы используете подзапрос вместо синтаксиса присваивания переменных, эти ограничения не применяются.

Смежные вопросы