Я использую Microsoft SQL Server Management Studio 2008 и столкнулся с проблемой создания представления. У меня такой код:

;WITH
    cteSample
    AS (
                    SELECT
                            vw_JobCosting_WIPMasterSub.SJob
                          , vw_JobCosting_WIPMasterSub.MJob
                          , vw_JobCosting_WIPMasterSub.MJob DisplayMJob
                          , vw_JobCosting_WIPMasterSub.GroupF
                          , 0 AS LVL
                    FROM vw_JobCosting_WIPMasterSub
                    WHERE vw_JobCosting_WIPMasterSub.GroupF = 'True'
                    UNION ALL
                            SELECT
                                    vw_JobCosting_WIPMasterSub.SJob
                                  , vw_JobCosting_WIPMasterSub.MJob
                                  , CASE S.LVL
                                            WHEN 0 THEN S.SJob
                                            ELSE S.DisplayMJob
                                            END AS DisplayMJob
                                  , vw_JobCosting_WIPMasterSub.GroupF
                                  , S.LVL + 1
                            FROM cteSample S
                            INNER JOIN vw_JobCosting_WIPMasterSub
                                    ON S.SJob = vw_JobCosting_WIPMasterSub.MJob
                            WHERE vw_JobCosting_WIPMasterSub.GroupF = 'False'
            )
SELECT
    cteSample.SJob
  , cteSample.DisplayMJob MJob
  , cteSample.GroupF
FROM cteSample
ORDER BY
    cteSample.LVL
  , cteSample.MJob
  , cteSample.SJob 

Этот код отлично работает как запрос. Когда я выполняю как View, я получаю сообщение:

«Невозможно проанализировать текст запроса»

Когда я в порядке, код выполняется нормально. Когда я пытаюсь сохранить, я получаю следующую ошибку, и она не сохраняется:

"Неправильный синтаксис рядом с ';'"

Любая помощь будет принята с благодарностью.

0
user2849560 5 Окт 2013 в 17:39
В вашем операторе нет create view, но похоже, что вы сбиты с толку использованием терминатора оператора ;. Он должен стоять в конце, а не перед оператором with.
 – 
a_horse_with_no_name
5 Окт 2013 в 17:41
Как правило, представления не должны содержать предложений ORDER BY jes.blogs.shellprompt.net/2010/02/25/views-and-order-by
 – 
JustinHui
5 Окт 2013 в 17:44
; before WITH - обычная практика, позволяющая избежать путаницы, когда оператор перед CTE не имеет; и это вызывает синтаксическую ошибку
 – 
Yuriy Galanter
5 Окт 2013 в 17:50
@YuriyGalanter: да. Но это незаконно перед with, если это часть create view. Вместо того, чтобы помещать терминатор оператора перед WITH, было бы намного лучше всегда помещать его в конец всех операторов (и этот вопрос показывает насколько запутанной может быть эта привычка - похоже, что user2849560 предполагает, что ключевое слово на самом деле "называется" ;WITH, а не WITH)
 – 
a_horse_with_no_name
5 Окт 2013 в 18:01

1 ответ

Лучший ответ

Вы должны иметь возможность создать свое представление с WITH в определении представления. Просто удалите разделитель ; (он вам все равно не нужен, поскольку WITH - ваш первый и единственный оператор) и ORDER BY (вы должны заказывать при использовании представления):

CREATE VIEW yourView AS
WITH
    cteSample
    AS (
                    SELECT
                            vw_JobCosting_WIPMasterSub.SJob
                          , vw_JobCosting_WIPMasterSub.MJob
                          , vw_JobCosting_WIPMasterSub.MJob DisplayMJob
                          , vw_JobCosting_WIPMasterSub.GroupF
                          , 0 AS LVL
                    FROM vw_JobCosting_WIPMasterSub
                    WHERE vw_JobCosting_WIPMasterSub.GroupF = 'True'
                    UNION ALL
                            SELECT
                                    vw_JobCosting_WIPMasterSub.SJob
                                  , vw_JobCosting_WIPMasterSub.MJob
                                  , CASE S.LVL
                                            WHEN 0 THEN S.SJob
                                            ELSE S.DisplayMJob
                                            END AS DisplayMJob
                                  , vw_JobCosting_WIPMasterSub.GroupF
                                  , S.LVL + 1
                            FROM cteSample S
                            INNER JOIN vw_JobCosting_WIPMasterSub
                                    ON S.SJob = vw_JobCosting_WIPMasterSub.MJob
                            WHERE vw_JobCosting_WIPMasterSub.GroupF = 'False'
            )
SELECT
    cteSample.SJob
  , cteSample.DisplayMJob MJob
  , cteSample.GroupF
FROM cteSample
1
Szymon 6 Окт 2013 в 00:38
Прекрасно работает. Спасибо.
 – 
user2849560
6 Окт 2013 в 05:59