2014-01-11 2 views
1

Используя нижеприведенный запрос (я новичок в CTE, поэтому это может быть грязно), я хочу создать путь обратной категории всех конечных категорий в моем база данных.SQL Server: CTE (рекурсия), условие установки вне CTE

В настоящий момент у меня есть один идентификатор, определенный внутри самого CTE (268707). Есть ли способ во время моего последнего основного запроса, что, когда я ссылаюсь на CTE, я могу предоставить переменную?

Я поместил комментарий в запрос, где я предполагаю, что это идеальное место для этого, но для жизни меня не может понять, как это сделать.

WITH recursion(stocknode_id, short_desc, parentnode_id, level) AS 
(
SELECT 
    stocknode_id, 
    short_desc, 
    parentnode_id, 
    0 AS level 

FROM stock_website_node AS swn 

WHERE swn.stocknode_id = 268707 

UNION ALL 

SELECT 
    swn.stocknode_id, 
    swn.short_desc, 
    swn.parentnode_id, 
    h.level + 1 

FROM stock_website_node AS swn 

INNER JOIN recursion AS h ON h.parentnode_id = swn.stocknode_id 
) 

SELECT 
TOP 1 STUFF 
(
    (
     SELECT '/' + swn_stuff.short_desc 
     FROM stock_website_node AS swn_stuff 
     WHERE swn_stuff.stocknode_id IN (SELECT stocknode_id FROM recursion) /* <--- I want to pass the variable from here, I think... */ 
     FOR XML PATH(''), TYPE 
    ).value('.','varchar(max)'), 
    1, 2, '' 
) AS category_tree 

FROM stock_website_node AS swn_a 

Что я бы в идеале хотелось что-то, что будет приносить результаты, если бы я должен был сделать что-то подобное тоже (но не появляется на работе):

WITH recursion(stocknode_id, short_desc, parentnode_id, level) AS 
(
    SELECT 
     stocknode_id, 
     short_desc, 
     parentnode_id, 
     0 AS level 

    FROM stock_website_node AS swn 

    UNION ALL 

    SELECT 
     swn.stocknode_id, 
     swn.short_desc, 
     swn.parentnode_id, 
     h.level + 1 

    FROM stock_website_node AS swn 

    INNER JOIN recursion AS h ON h.parentnode_id = swn.stocknode_id 
) 

SELECT 
    TOP 1 STUFF 
    (
     (
      SELECT '/' + swn_stuff.short_desc 
      FROM stock_website_node AS swn_stuff 
      WHERE swn_stuff.stocknode_id IN (SELECT x.stocknode_id FROM recursion AS x WHERE x.xtocknode_id = swn_a.stocknode_id) 
      FOR XML PATH(''), TYPE 
     ).value('.','varchar(max)'), 
     1, 2, '' 
    ) AS category_tree 

FROM stock_website_node AS swn_a 

WHERE swn_a = 268707 OR swn_a = 268708 OR swn_a = 268709 

Я создал codepad с SQL для создания переменной таблицы, чтобы вы могли точно видеть, что я делаю, если вы хотите запустить код (http://codepad.org/4AaZEnlq).

В таблице содержатся категории, а parentnode_id относится к background_ode_id родительской категории. Значение parentnode_id из 0 означает, что это категория верхнего уровня. Переменная при условии, в настоящее время в КТР категория нижнего уровня, и запрос в целом строит путь категории, как результат, такие как:

верхнего уровня/второго уровня/третьего уровня/Четвертый уровень

Во время основной query Я хочу предоставить несколько категорий нижнего уровня и возвращать путь категории для каждого из них, но с текущим ограничением только того, что вы можете вручную определить один идентификатор нижнего уровня, а не динамически предоставлять несколько, я немного застрял.

+0

уверен, у вас есть те же параметры, что и с любым другим запросом. – RBarryYoung

ответ

3

Заменить постоянное значение в CTE переменной и присвоить значение переменной перед выполнением запроса.

Вы не можете передать значение в CTE, где вы прокомментировали код. Значение должно быть присвоено переменной перед всем запросом.

declare @v int; 
set @v = 268707; 

with .... 
(
    select ... 
    where swn.stocknode_id = @v 
    union all 
    select ... 
) 
select ... 

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

declare @T table(stocknode_id int); 
insert into @T values(8), (12); 

with R as 
(
    select C.stocknode_id, 
     cast(C.short_desc as varchar(max)) as short_desc, 
     C.parentnode_id 
    from @categories as C 
    where C.stocknode_id in (select T.stocknode_id from @T as T) 
    union all 
    select C.stocknode_id, 
     C.short_desc + '/' + R.short_desc, 
     C.parentnode_id 
    from @categories as C 
    inner join R 
     on C.stocknode_id = R.parentnode_id 
) 
select R.short_desc 
from R 
where R.parentnode_id = 0; 

SQL Fiddle

+0

Я попытался использовать переменную при выборе из 'swn_a', однако я получал ошибку:' Оператор SELECT, который присваивает значение переменной, не должен сочетаться с операциями извлечения данных. ' – BenOfTheNorth

+0

Вы должны назначить значение переменной ** перед ** вы выполняете свой запрос. –

+0

А вот моя проблема заключается в том, что я хочу, чтобы переменная была динамически задана, то есть '@var = swn_a.stocknode_id' – BenOfTheNorth

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