Когда следует использовать точки с запятой в SQL Server?

проверяя некоторый код в интернете и скрипты, созданные SQL Server Management Studio, я заметил, что некоторые операторы заканчиваются точкой с запятой.

поэтому, когда я должен использовать его?

13 ответов


из a SQLServerCentral.Com статьи Кен полномочия:

Точка С Запятой

точка с запятой является Терминатором оператора. Он является частью стандарта ANSI SQL-92, но никогда не использовался в Transact-SQL. Действительно, можно было годами кодировать T-SQL, не встречая точки с запятой.

использование

есть две ситуации, в которых необходимо использовать точку с запятой. Первая ситуация где используется общее табличное выражение (CTE), и CTE не является первым оператором в пакете. Во втором случае выдается инструкция Service Broker, и инструкция Service Broker не является первой инструкцией в пакете.


по умолчанию операторы SQL завершаются точкой с запятой. Вы используете точку с запятой для завершения операторов, если вы (редко) не установили новый терминатор операторов.

Если вы отправляете только один оператор, технически вы можете обойтись без оператора terminator; в сценарии, поскольку вы отправляете более одного оператора, вам это нужно.

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

изменить: в ответ на те, кто говорит, что Терминаторы операторов не требуются [определенными СУБД], хотя это может быть правдой, они требуются стандартом ANSI SQL. Во всем программировании, если мы можем придерживаться стандарта без потери функциональности, мы должны, потому что тогда ни наш код, ни наши привычки не привязаны к одному проприетарному поставщику.

с некоторыми компиляторами C возможно иметь main return void, даже если стандарт требует main для возврата int. Но это делает наш код, и мы сами, менее портативные.

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


в SQL2008 BOL говорят, что в следующих выпусках будут необходимы точки с запятой. Поэтому, всегда используйте его.

ссылки:


Если я правильно прочитал это, это будет требование использовать точки с запятой для завершения операторов TSQL. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

изменить: Я нашел плагин для SSMS 2008R2, который отформатирует ваш скрипт и добавит точки с запятой. Я думаю, что он все еще в бета-версии...

http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

изменить: Я нашел еще лучший бесплатный инструмент / плагин под названием ApexSQL... http://www.apexsql.com/


вы должны использовать его.

практика использования точки с запятой для завершения операторов является стандартной и фактически является требованием в нескольких других платформах баз данных. SQL Server требует точку с запятой только в частности случаи-но в случаях, когда точка с запятой не требуется, использование одного не вызывает проблем. Я настоятельно рекомендую вам принять практику прекращения всех заявлений точкой с запятой. Не только этим улучшить читабельность кода, но в некоторых случаях она может избавлю тебя от горя. (Если точка с запятой требуется и не указана, сообщение об ошибке SQL Сервер производит не всегда очень ясно.)

и самое главное:

документация по SQL Server указывает, что не завершающие операторы T-SQL с точка с запятой является устаревшей функцией. Это означает, что долгосрочной целью является обеспечение использования запятых в будущая версия продукта. Это еще одна причина, чтобы попасть в привычка прекращать все ваши заявления, даже там, где это в настоящее время не требуется.

источник: Microsoft SQL Server 2012 T-SQL основы Ицик Бен-Ган.


пример того, почему вы должны всегда использовать ; следующие два запроса (скопированы из этого в должности):

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
    THROW
END CATCH

enter image description here

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException;
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    THROW
END CATCH

enter image description here


личное мнение: использовать их только там, где они необходимы. (См. ответ TheTXI выше для требуемого списка.)

поскольку компилятор не требует их, вы can положите их все, но почему? Компилятор не скажет вам, где вы забыли один, поэтому вы закончите непоследовательным использованием.

[это мнение относится только к SQL Server. К другим базам данных могут предъявляться более жесткие требования. Если вы пишете SQL для запуска в нескольких базах данных, ваши требования могут отличаться.]

tpdi указано выше: "в скрипте, поскольку вы отправляете более одного оператора, вам это нужно.- На самом деле это не так. Они тебе не нужны.

PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';

выход:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional

мне еще многое нужно узнать о T-SQL, но при разработке некоторого кода для транзакции (и на основе кода на примерах из stackoverflow и других сайтов) я нашел случай, когда кажется, что требуется точка с запятой, и если она отсутствует, оператор, похоже, не выполняется вообще и ошибка не возникает. Это, похоже, не охватывается ни одним из вышеприведенных ответов. (Это было использование MS SQL Server 2012.)

Как только у меня была транзакция, работающая так, как я хотел, я решил поставить try-catch вокруг него, поэтому, если есть какие-либо ошибки, он откатывается. Только после этого транзакция не была зафиксирована (SSMS подтверждает это при попытке закрыть окно приятным сообщением, предупреждающим вас о том, что существует незафиксированная транзакция.

это

COMMIT TRANSACTION 

вне блока BEGIN TRY/END TRY работал нормально, чтобы совершить транзакцию, но внутри блока это должно было быть

COMMIT TRANSACTION;

Примечание нет ошибки или предупреждения и нет никаких указаний на то, что транзакция все еще не разблокирована до попытки закрыть вкладку запроса.

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

наоборот, транзакция отката, похоже, работает одинаково хорошо в блоке begin CATCH с точкой с запятой или без нее.

могут будьте логичны в этом, но это кажется произвольным и Алисой в Стране Чудес.


по данным запрос Transact-SQL с синтаксисом конвенций (язык Transact-SQL) в (MSDN)

Терминатор инструкций Transact-SQL. Хотя точка с запятой не требуется для большинства операторов в этой версии SQL Server, она потребуется в будущей версии.

(Также см. комментарий @gerryLowry)


похоже, что точки с запятой не следует использовать в сочетании с операциями курсора: OPEN, FETCH, CLOSE и DEALLOCATE. Я просто потратил пару часов на это. Я внимательно посмотрел на BOL и заметил, что [;] не отображается в синтаксисе для этих операторов курсора!!

Так я: Открыть mycursor; и это дало мне ошибку 16916.

но: Открыть mycursor работал.


точки с запятой не всегда работают в составных операторах SELECT.

сравните эти две разные версии тривиального составного оператора SELECT.

код

DECLARE @Test varchar(35); 
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.';););); 
SELECT @Test Test;

возвращает

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.
код
DECLARE @Test varchar(35)
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.'))) 
SELECT @Test Test

возвращает

Test
-----------------------------------
Semicolons do not always work fine.

(1 row(s) affected)

при использовании оператора DISABLE или ENABLE TRIGGER в пакете, в котором есть другие операторы, оператор непосредственно перед ним должен заканчиваться точкой с запятой. В противном случае вы получите синтаксическую ошибку. Этим я вырвала себе волосы... И после этого я наткнулся на этот элемент MS Connect примерно на то же самое. Он закрыт, так как не будет исправляться.

посмотреть здесь


Примечание: это ответ на вопрос, как написано, но не проблема, как говорится. Добавляя его здесь, так как люди будут искать его

точка с запятой используется также перед WITH в рекурсивных операторах CTE:

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

этот запрос будет генерировать CTE-числа, состоящие из целых чисел [1..10]. Это делается путем создания таблицы только со значением 1, а затем рекурсии до достижения 10.


Если вам нравится получать случайные Тайм-Аут Команды ошибки в SQLServer затем оставить точку с запятой в конце строки CommandText.

Я не знаю, задокументировано ли это где-нибудь или это ошибка, но это происходит, и я узнал это из горького опыта.

У меня есть проверяемые и воспроизводимые примеры с использованием SQLServer 2008.

ака -> на практике, всегда включайте Терминатор, даже если вы просто отправить один инструкция к базе данных.