3

给定以下 SQL:

;WITH Results AS
    (
        SELECT ItemListID, Title,  
        ROW_NUMBER() OVER(ORDER BY ItemListID DESC) as intRow, 
        COUNT(ItemListID) OVER() AS ActualNumberOfResults 
        FROM ItemData
        WHERE FREETEXT(Title, @FTSSearchTerm)
        AND WebsiteID = @WebsiteID
        AND ContentTypeID = @ContentTypeID
        AND GeoID2 = @GeoID                                 
     )
SELECT * FROM Results
WHERE intRow BETWEEN @intStartRow AND @intEndRow
ORDER BY ItemListID DESC    

SELECT @NumberOfResultsReturned = @@ROWCOUNT

我想将一个参数 @ActualNumberOfResults 设置为从 CTE 返回的 TOP(1) ActualNumberOfResults 的值。

在 CTE 之后,我使用了以下内容,但似乎重复:

SELECT @ActualNumberOfResults = COUNT(*)
FROM ItemData
WHERE CONTAINS(Title, @FTSSearchTerm  )
AND WebsiteID=@WebsiteID 

我怎样才能做到这一点?

4

2 回答 2

3
;WITH cte AS
 (
  SELECT ItemListID, Title,
         CASE WHEN ROW_NUMBER() OVER(ORDER BY ItemListID DESC) 
                   BETWEEN @intStartRow AND @intEndRow THEN 1
                   END AS NumberOfResultsReturned,      
         COUNT(ItemListID) OVER() AS ActualNumberOfResults          
  FROM ItemData
  WHERE FREETEXT(Title, @FTSSearchTerm)
        AND WebsiteID = @WebsiteID
        AND ContentTypeID = @ContentTypeID
        AND GeoID2 = @GeoID                                 
 )
 SELECT @NumberOfResultsReturned = COUNT(NumberOfResultsReturned), 
        @ActualNumberOfResults = MAX(ActualNumberOfResults)
 FROM cte         

SQLFiddle上的演示

于 2012-12-30T12:22:22.283 回答
0

访问在 MSDN 上查看此链接> http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c774bb71-84c9-44ce-bfce-a256ecbf56ab

;WITH CTE1
 AS (...)
SELECT * FROM CTE1

;WITH CTE2
AS (...)
SELECT * FROM CTE2 

这里是你的代码

;WITH Results AS
    (
        SELECT ItemListID, Title,  
        ROW_NUMBER() OVER(ORDER BY ItemListID DESC) as intRow, 
        COUNT(ItemListID) OVER() AS ActualNumberOfResults 
        FROM ItemData
        WHERE FREETEXT(Title, @FTSSearchTerm)
        AND WebsiteID = @WebsiteID
        AND ContentTypeID = @ContentTypeID
        AND GeoID2 = @GeoID                                 
     )
SELECT * FROM Results
WHERE intRow BETWEEN @intStartRow AND @intEndRow
ORDER BY ItemListID DESC   

SELECT @NumberOfResultsReturned = @@ROWCOUNT

;WITH Results1 AS
    (
        SELECT ItemListID, Title,  
        ROW_NUMBER() OVER(ORDER BY ItemListID DESC) as intRow, 
        COUNT(ItemListID) OVER() AS ActualNumberOfResults 
        FROM ItemData
        WHERE FREETEXT(Title, @FTSSearchTerm)
        AND WebsiteID = @WebsiteID
        AND ContentTypeID = @ContentTypeID
        AND GeoID2 = @GeoID                                 
     )

SELECT @ActualNumberOfResults = COUNT(*)
FROM Results1
于 2012-12-11T19:25:50.397 回答