Почему SQL Server Management Studio получает эти синтаксические ошибки из скопированного кода - PullRequest
0 голосов
/ 21 марта 2019

Итак, тестируя некоторый код, я обнаружил странное поведение с кодом, который я вставил в окно запроса. Ниже приведен упрощенный пример того, откуда я взял код:

declare @a nvarchar(max) = '';

select @a = 'select ' + cast(n as char(1)) + ';' + char(13) + 'GO' + char(13) from nums where n = 1;

print @a

exec sp_executesql @a

Это было выполнено в окне запроса в SSMS. Конечно, это ошибка из-за этого GO разделителя, который не будет работать в динамическом SQL.

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

select 1;
GO

select 1
GO

Первый оператор дает синтаксическую ошибку, а второй обрабатывает GO как псевдоним столбца. Интересно, что это продолжало быть правдой, если я просто вводил код прямо в это окно запроса. Это не затронуло другие окна или новые, только то, в которое я вставил результаты PRINT.

Последний интересный факт по этому поводу состоит в том, что если я сравнил выполнение LEN() в приведенном выше примере в «плохом» окне запроса с тем, который работает, как и ожидалось, «плохой» запрос имеет длину 26 символов, но обычный один - 31.

Я обнаружил, что возврат всех символов не помог, но если я выбрал «Выделить все» и удалил, это, похоже, исправило бы это. Я предполагаю, что это означает, что он получает непечатный символ, но если я сделаю Select All и скопирую в Notepad ++ с опцией Show All Symbols, я не увижу ничего заметного.

Кто-нибудь знает, почему SSMS ведет себя так? Я использую версию 17.9 (и работаю с экземпляром SQL Server 2014, если это имеет значение).

1 Ответ

6 голосов
/ 21 марта 2019

char(13) - возврат каретки (CR).char(10) - перевод строки (LF).

Windows использует CRLF в качестве ограничителя строки.Linux использует LF в качестве ограничителя строки.

Ни одна современная среда не использует просто CR в качестве ограничителя строки, как ваш скрипт.SSMS визуализирует CR, вставляя вертикальное пространство, и это поведение, вероятно, унаследовано от базовой кодовой базы Visual Studio.

Пакетный анализатор TSQL SSMS, однако, не распознает CR как терминатор строки, поэтому он не 'искать символ GO после CR.Работает с LF или CRLF.

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