Вернуть два набора результатов при использовании WITH TempResults AS - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть следующий запрос, где я хотел бы вернуть два набора результатов. Один - это результаты в виде таблицы, а второй - просто число потенциальных результатов или MaxResults.

Ошибка последней строки с 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;

спасибо

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Этого нельзя сделать (насколько я знаю).Существует три обходных пути, один из которых позволяет сохранить два отдельных набора результатов, а два других требуют объединения результатов в один и тот же набор результатов (либо в виде дополнительной строки, либо дополнительного столбца).

  1. Вместо CTE поместите результаты во временную таблицу, а затем запросите из нее.
  2. Объедините счетчик с фактическим набором результатов в виде другой строки: используйте UNION ALL и присвойте строке счетчика подходящие значения для идентификатора, Name и 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);

Я не могу ручаться за производительность - вам нужно профилировать.

1 голос
/ 13 февраля 2012
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...