sp_executesql не проверяет строку запроса

Сегодня я столкнулся с худшей ситуацией. В базе данных есть хранимая процедура, мне пришлось ее изменить, используя встроенный запрос,

Все прошло хорошо, выполнив этот запрос:

DECLARE @script AS NVARCHAR(MAX)

SET @script = 'ALTER PROCEDURE GetALL
               with recompile
               AS
               BEGIN
                   SELECT *  
                   FROM dbo.Main
                   INNER JOIN dbo.alabla ON dbo.Main.ID = dbo.ATTENDANCE.EMPLOYEE_ID
               END'

EXEC sp_executesql @script ;

Выше запрос имеет синтаксическую ошибку alabla, таблица не существует, но EXEC sp_executesql @script ; выполняется без каких-либо ошибок.

и когда я пытался использовать эту хранимую процедуру, я получаю сообщение об ошибке:

Сообщение 208, Уровень 16, Состояние 1, Процедура GetALL, Строка 5
Неверное имя объекта 'dbo.alabla'.

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

1 ответ

Решение

Посмотрите здесь: Как прекомпилировать хранимые процедуры на сервере SQL?

sp_recompile пометит только метод, который будет перекомпилирован при следующем вызове...

Если ваша вновь созданная процедура не манипулирует данными (ваш пример выше), вы можете просто вызвать ее немедленно...

Лучшая подсказка может быть, чтобы посмотреть на SET FMTONLY даже если это устарело ( https://msdn.microsoft.com/de-de/library/ms173839(v=sql.120).aspx) или вы можете использовать sp_describe_first_result_set (и связанные: смотрите ссылки на упомянутой странице).

Это должно заставить немедленную компиляцию...

Кроме того, посмотрите на

  • DBCC CHECKDB
  • DBCC FREEPROCCACHE
  • DBCC PROCCACHE

Кстати: я бы не использовал SP, если вы хотите только читать данные. Ваш пример выше был бы идеальным кандидатом для встроенного (одиночного, специального) TVF...

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