Получив странную ошибку, запрос SQL Server с использованием предложения WITH - PullRequest
38 голосов
/ 30 апреля 2010

Следующий запрос:

WITH 
    CteProductLookup(ProductId, oid) 
    AS 
    (
        SELECT p.ProductID, p.oid
        FROM [dbo].[ME_CatalogProducts] p 
    )

SELECT 
    rel.Name as RelationshipName,
    pl.ProductId as FromProductId,
    pl2.ProductId as ToProductId
FROM 
    (
    [dbo].[ME_CatalogRelationships] rel 
    INNER JOIN CteProductLookup pl 
    ON pl.oid = rel.from_oid
    ) 
    INNER JOIN CteProductLookup pl2 
    ON pl2.oid = rel.to_oid
WHERE
    rel.Name = 'BundleItem' AND
    pl.ProductId = 'MX12345';

Генерирует эту ошибку:

Сообщение 319, уровень 15, состояние 1, строка 5 Неверный синтаксис рядом с ключевым словом 'с'. Если это утверждение является распространенным табличное выражение, пространство имен xml пункт или контекст отслеживания изменений предложение, предыдущее утверждение должно быть заканчивается точкой с запятой.

Вкл исполнение * только 1011 *. Нет ошибок / предупреждений в операторе sql в студии управления.

Есть идеи?

Ответы [ 3 ]

82 голосов
/ 30 апреля 2010

всегда используйте с оператором типа ;WITH, тогда вы никогда не получите эту ошибку. Команда WITH требует ; между ней и любой предыдущей командой, всегда используя ;WITH, вам никогда не придется помнить об этом.

см. С common_table_expression (Transact-SQL) , из раздела Рекомендации по созданию и использованию общих табличных выражений:

Когда CTE используется в выражении, которое является частью партии, заявление прежде чем оно должно сопровождаться точка с запятой.

17 голосов
/ 30 апреля 2010
;WITH 
    CteProductLookup(ProductId, oid) 
    AS 
...
4 голосов
/ 30 апреля 2010

Правильно ставить точку с запятой непосредственно перед ключевым словом WITH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...