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 に答える