Как вы можете видеть, вопрос «почему» требует другого типа ответа, включая историческое обоснование и лежащие в основе предположения о языке, я не уверен, что смогу действительно оправдать это.
Эта всеобъемлющая статья SQL MVP Erland Sommarskog действительно пытается дать некоторое объяснение, наряду с механикой:
Проклятие и благословения динамического SQL :
Кэширование планов запросов
Каждый запрос, который вы запускаете в SQL Server, требует плана запроса. Когда вы запускаете запрос в первый раз, SQL Server создает для него план запроса - или, как говорит терминология, - он компилирует запрос. SQL Server сохраняет план в кеше, и в следующий раз, когда вы выполняете запрос, план используется повторно.
Это (и безопасность, см. Ниже), вероятно, самая большая причина.
SQL работает при условии, что запросы - это не разовые операции, а то, что они будут использоваться снова и снова. Если таблица (или база данных!) Фактически не указана в запросе, она не может сгенерировать и сохранить план выполнения для будущего использования.
Да, не каждый запрос, который мы выполняем, будет использоваться повторно, но это рабочая предпосылка SQL по умолчанию , поэтому «исключения» должны быть исключительными.
Несколько других причин перечисляет Эрланд (обратите внимание, что он явно перечисляет преимущества использования хранимых процедур , но многие из них также являются преимуществами параметризованных (нединамических) запросов):
- Система разрешений : механизм SQL не может предсказать, есть ли у вас права на выполнение запроса, если он не знает таблицу (или базу данных), с которой вы будете работать. «Цепочки разрешений», использующие динамический SQL, являются проблемой в заднице.
- Сокращение сетевого трафика . Передача имени хранимого процесса и нескольких значений параметров по сети короче, чем длинная инструкция запроса.
- Инкапсуляция логики : вы должны быть знакомы с преимуществами инкапсуляции логики из других сред программирования.
- Отслеживание того, что используется : если мне нужно изменить определение столбца, как я могу найти весь код, который его вызывает? Системные процедуры существуют для поиска зависимостей в базе данных SQL, но только если код находится в хранимых процедурах.
- Простота написания кода SQL : проверка синтаксиса происходит при создании или изменении хранимой процедуры, поэтому, надеюсь, будет меньше ошибок.
- Устранение ошибок и проблем : администратор базы данных может отслеживать и измерять производительность отдельных хранимых процедур гораздо проще, чем постоянно меняющийся динамический SQL.
Опять же, у каждого из них есть сто нюансов, в которые я не буду вдаваться.