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

Я не понимаю, что происходит.

Это генерирует ошибку

create procedure sp_test
as
/*
   /*
      a
   */
   e'
*/
begin
print''
end
go

"Сообщение 102, Уровень 15, Состояние 1, Процедура sp_test, Строка 13 Неверный синтаксис рядом с" go "."

Пока это работает

create procedure sp_test
as
/*
   /*
      a
   */
   e
*/
begin
print''
end
go

Почему, если у меня есть два вложенных комментария в главном комментарии, у меня не может быть символа '? Я обнаружил эту ошибку, используя VS Sql Compare для генерации сценария db, и после этого невозможно получить какой-либо другой GO.

Вместо этого, используя Sql Management, он сгенерирует один скрипт sp_test без GO..

2 ответа

Решение

Это должно быть ошибка в SQL Server Management Studio.

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

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

Как таковой, если GO Команда фактически отправляется на SQL Server для выполнения, она не знает, как ее обработать, и, следовательно, выдает ошибку, которую вы получили.

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

Таким образом, я думаю, что ошибка в том, что код, который пытается разбить на GO Утверждение фактически не поддерживает вложенные комментарии и, следовательно, опровергается их наличием. В основном кажется, что комментарий заканчивается после внутреннего */, что неверно, и тогда апостроф считается началом строки, которая не имеет конца, который затем инкапсулирует все, что следует, включая GO команда.

Таким образом, все после апострофа отправляется на SQL Server. SQL Server поддерживает вложенные комментарии, поэтому он увидит GO команда как утверждение, которое она не поддерживает, и, следовательно, ошибка.


Я сообщил об этом с помощью Microsoft Connect здесь: SQL Server 2014 Management Studio при разделении по команде GO не обрабатывает вложенные комментарии.

В то время как сам SQL Server допускает вложенные комментарии блока, код пакетного анализа, используемый SSMS, SQLCMD.EXE и, возможно, SMO, содержит ошибку, которая не полностью обрабатывает эти вложенные комментарии блока. Я подчеркиваю "полностью", потому что этот код будет обрабатывать их до некоторой степени. Все зависит от того, как они вложены и куда встроены GO или апостроф и т. д. Некоторые комбинации работают, а другие нет. Например, следующая адаптация вашего нерабочего теста работает, потому что я добавил второй вложенный комментарий:

create procedure sp_test
as
/*
   /*
      a
   */
   /*
   e'
   */
*/
begin
print''
end
go

Я опубликовал эту ошибку в Microsoft Connect еще в марте, но я сомневаюсь, что она когда-нибудь будет иметь достаточный приоритет, чтобы, к сожалению, посвятить разработчиков:

"GO" во 2-й половине комментариев вложенного блока прерывает пакетный анализ в SSMS и SQLCMD

PS Следует отметить, что более старая OSQL.EXE, похоже, не имеет этой конкретной проблемы синтаксического анализа, хотя я все равно не рекомендовал бы ее использовать;-).

Другие вопросы по тегам