2014-05-11 2 views
0

У меня есть сложный запрос для выбора страничного записей «с», я хочу, чтобы повторно использовать последнюю временную таблицу для другого использования, как количество записей:SQL, как повторно использовать временную таблицу

;with ProductCatIDs 
    as 
    (
     select 
      ID, ParentID, Name 
     from 
      [tbl_Categories] 
     where 
      ID = @CatID 
     union all 
     select 
      m.ID, m.ParentID, m.Name 
     from 
      [tbl_Categories] m 
     join 
      ProductCatIDs on ProductCatIDs.ID = m.ParentID 
    ), 

    ProductsFiltered as (

SELECT DISTINCT tbl_Products.* 
FROM   tbl_ProductCategories RIGHT OUTER JOIN 
         tbl_Products ON tbl_ProductCategories.ProductID = tbl_Products.ID 
WHERE  tbl_Products.Enabled = 'true' and (tbl_ProductCategories.CategoryID IN (

    select id 
    from ProductCatIDs 

))), 

#ProductsNumbered as (

Select *, ROW_NUMBER() OVER (order by ID DESC) as RowNumber FROM ProductsFiltered 

    ) 

SELECT * FROM #ProductsNumbered As tbl_Products 
    Where 
    RowNumber > @FirstRec 
    And RowNumber < @LastRec 



SELECT Count(*) FROM #ProductsNumbered 

Последнего оператор возвращает ошибку Invalid имя объекта '#ProductsNumbered'

Как я могу повторно использовать #ProductsNumbered, чтобы избежать вычисления всего SP только для простого счетчика?

SELECT Count(*) FROM #ProductsNumbered 

ответ

1

не делая #ProductsNumbered частью вашей общей таблицы выражения, но вставив в него вручную с вашего ProductsFiltered. Затем вы сможете повторно использовать его.

;with ProductCatIDs 
as 
    (
    ----SNIPPED TO KEEP POST SMALL------- 
), ProductsFiltered as (
    ----SNIPPED TO KEEP POST SMALL-------    
), 
    SELECT *, 
    ROW_NUMBER() OVER (order by ID DESC) as RowNumber 
    INTO #ProductsNumbered 
    FROM ProductsFiltered 

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

+0

Спасибо Аллан :) – Mertez