2012-02-13 30 views
0

我有以下查詢,我想返回兩個結果集。一個是表格結果,另一個是返回潛在結果數量或MaxResults。使用WITH TempResults返回兩個結果集AS

最後一行錯誤Invalid object name ResultsTemp。直到我註釋掉第二行,它纔會起作用。看來我只能使用ResultsTemp一次。

DECLARE @StartRow int; 
DECLARE @MaxRows int; 
set @StartRow = 0; 
set @MaxRows = 5; 

WITH ResultsTemp AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY FTS.RANK DESC) AS RowId, 
    Id, Name FROM tNews 
    INNER JOIN CONTAINSTABLE(tNews, *, 'FORMSOF(INFLECTIONAL, hello)') 
     AS FTS ON tNews.Id = FTS.[KEY] 
) 

SELECT Id, Name, RowId FROM ResultsTemp 
Group By Id, Name, RowId 
Having RowId between @StartRow and (@StartRow + @MaxRows); 

select COUNT(*) from ResultsTemp; 

謝謝

回答

1
Create table #temp 
(
    Id int, 
    Name Varchar(100), 
    RowId int 
) 

DECLARE @StartRow int; 
DECLARE @MaxRows int; 
set @StartRow = 0; 
set @MaxRows = 5; 

SELECT ROW_NUMBER() OVER (ORDER BY FTS.RANK DESC) AS RowId, 
Id, Name into #temp FROM tNews 
INNER JOIN CONTAINSTABLE(tNews, *, 'FORMSOF(INFLECTIONAL, hello)') 
AS FTS ON tNews.Id = FTS.[KEY] 

SELECT Id, Name, RowId FROM #temp 
Group By Id, Name, RowId 
Having RowId between @StartRow and (@StartRow + @MaxRows); 

select COUNT(RowId) from #temp; 
2

這不能(據我所知)來完成。有三種解決方法,一種允許您保留兩個不同的結果集,另外兩個需要將結果合併到相同的結果集中(作爲額外的行或額外的列)。

  1. 不是CTE,而是將結果推送到一個臨時表中,然後從中進行查詢。
  2. 合併計爲實際的結果集作爲另一行:使用UNION ALL並給數列的ID,名稱與rowid合適的值,以便可以從該數據的其餘部分提取出來
  3. 添加SELECT COUNT(*)進入主要結果集爲CROSS JOIN或類似的附加列。

對於後者,你可以通過改變主查詢做到這一點:

SELECT Id, Name, RowId, countTable.totalRows 
    FROM ResultsTemp 
     CROSS JOIN (SELECT COUNT(*) AS totalRows FROM ResultsTemp) AS countTable 
    GROUP BY Id, Name, RowId 
    HAVING RowId BETWEEN @StartRow and (@StartRow + @MaxRows); 

我不能保證性能 - 你需要的資料。