Так много раз видел with
и так много раз SQL Server спрашивал, что перед ним стоит ;
Как работает ;with ...
??
;with coords(...) as (
SELECT * ...
)
Почему перед ним должно стоять ;
?
Так много раз видел with
и так много раз SQL Server спрашивал, что перед ним стоит ;
Как работает ;with ...
??
;with coords(...) as (
SELECT * ...
)
Почему перед ним должно стоять ;
?
В SQL точка с запятой используется для завершения запроса. Помещая его перед таким запросом, просто убедитесь, что база данных понимает, что любой предыдущий запрос закончился.
Первоначально это требовалось после каждого запроса, поскольку они вводились построчно, поэтому база данных должна была знать, когда выполнять запрос. Когда весь запрос отправляется в виде одной строки, точка с запятой нужна только в том случае, если синтаксиса SQL недостаточно, чтобы определить, где заканчивается запрос. Поскольку ключевое слово with
используется по-разному, перед ним иногда требуется точка с запятой, чтобы убедиться, что оно не является частью предыдущего запроса.
Использование WITH для CTE требует, чтобы предыдущая инструкция заканчивалась на ;
. Использование его в начале гарантирует правильный синтаксис
То же самое делает MERGE в SQL Server 2008.
См. этот вопрос SO: Неверно синтаксис рядом с ключевым словом 'with'... предыдущий оператор должен заканчиваться точкой с запятой
Лучше всего завершать каждый оператор SQL точкой с запятой. В документации по SQL Server (например, здесь) предлагается сделать это обязательно. в будущей версии на самом деле нет оправдания тому, чтобы не войти в привычку сейчас.
Чтобы ответить на вопрос: вы видите ;WITH...
в Stackoverflow, потому что ЛИБО человек, который отвечает, является неаккуратным кодером, ИЛИ тот, кто отвечает, предполагает, что человек, задающий вопрос, является небрежным кодером (и они будут утверждать, что это последнее, когда это первое :) Определение «неаккуратный кодер» здесь — это тот, кто использует точку с запятой только тогда, когда его вынуждают это делать.
Использование WITH предназначено для общих табличных выражений (CTE). Они пытались заставить CTE быть определенным как первый оператор (т.е. не может быть связан с другими частями запроса, поэтому;)
WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON )
, что приводит к многократному контекстуальному использованию ключевого словаwith
вместе с общим табличным выражением. Точка с запятой позволяет избежать путаницы, которая может возникнуть в сознании SQL Server при анализе запроса. - person RBT   schedule 12.08.2016