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



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



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

705   13  

13 ответов:

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

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

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

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

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

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

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

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

изменить: in ответ на эти слова Терминаторы операторов не требуются [конкретной СУБД], хотя это может быть правдой, они требуются стандартом 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 основы Ицик Бен-Ган.


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

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 выше для необходимого списка.)

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

[это мнение специфично для 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.)

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

это

COMMIT TRANSACTION 

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

COMMIT TRANSACTION;

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

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

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

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

по данным синтаксические соглашения Transact-SQL (Transact-SQL) (MSDN)

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

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

похоже, что точки с запятой не следует использовать в сочетании с операциями курсора: открыть, извлечь, закрыть и освободить. Я просто потратил пару часов на это. Я внимательно посмотрел на 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.

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

Comments

    Ничего не найдено.