SQL Server 2008 R2 - запрос из SSMS 2014 года, но также не выполняется из кода.

Странно - первая ссылка на таблицу B работает, вторая - с ошибкой «Недопустимый объект B». Что я делаю неправильно? GO не помогают.

        WITH B as (SELECT BatchOutId, SettleMerchantCode, BatchDate, BatchStatusCode, BatchTransCnt, BatchTotAmt, BatchAdjustAmt, BatchAdjustCnt
        FROM     MAF01
        GROUP BY BatchOutId, SettleMerchantCode, BatchDate, BatchStatusCode, BatchTransCnt, BatchTotAmt, BatchAdjustAmt, BatchAdjustCnt)
        SELECT * FROM B ORDER BY BatchOutId DESC
        SELECT * FROM B ORDER BY BatchOutId DESC
0
rheitzman 15 Дек 2014 в 20:57

3 ответа

Лучший ответ

Cte действителен только для одного запроса, а не для всего пакета. Итак, как только вы выполните первый SELECT * FROM B, этот запрос будет завершен. Следующий запрос больше не имеет доступа к cte, который использовал первый запрос.

0
Tab Alleman 15 Дек 2014 в 21:03
Спасибо - раньше я использовал два SELECT, но с UNION между ними.
 – 
rheitzman
16 Дек 2014 в 23:38

Это как и ожидалось.

CTE включены только в следующий оператор. Это просто именованные запросы.

Вам нужно будет либо

  1. Повторите определение CTE.
  2. Переместите определение в представление или встроенную функцию.
  3. Материализуйте результаты в временную таблицу.

В зависимости от того, чего вы ожидали.

2
Martin Smith 15 Дек 2014 в 21:03

Я знаю, что это должно быть дублировано

У вас может быть несколько CTE, но только один оператор
Два Select - это два утверждения

Если вы используете #temp, у вас может быть более одного оператора

0
paparazzo 15 Дек 2014 в 21:03