【问题标题】:SQL how to reuse temp tableSQL如何重用临时表
【发布时间】:2014-05-11 13:21:26
【问题描述】:

我有一个复杂的查询来选择带有“with”的分页记录,我想将最后一个临时表重用于其他用途,例如记录计数:

;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 object name '#ProductsNumbered'

如何重用#ProductsNumbered 以避免仅为一个简单的计数器计算整个 SP?

SELECT Count(*) FROM #ProductsNumbered 

【问题讨论】:

    标签: sql sql-server pagination temp-tables reusability


    【解决方案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 
    

    通过这种方式,您应该可以访问公共表表达式范围之外的临时表,并且可以在其上运行多个查询。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2011-02-05
      • 1970-01-01
      • 2011-09-06
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2018-04-07
      相关资源
      最近更新 更多