Итак, тестируя некоторый код, я обнаружил странное поведение с кодом, который я вставил в окно запроса. Ниже приведен упрощенный пример того, откуда я взял код:
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, если это имеет значение).