Простите, я разработчик, который перешел в мир SQL. Я думал, что смогу улучшить SQL, добавив переменные, но он не работал так, как я ожидал. Может кто-нибудь сказать мне, почему это не работает? Я не хочу работать вокруг, я хочу знать причины, почему это не работает, как я полагаю, что должно, так как я уверен, что есть веская причина, но в настоящее время это не бросается в глаза мне.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
Gareth
источник
источник
USE
команду с параметром.GO
, ранее объявленная переменная исчезает. Возможно, вы захотите изучить переменные SQLCMD, которые могут или не могут быть применимы к вашему сценарию.Ответы:
На онлайн-странице Книги для переменных
Это будет работать так, как вы ожидаете, если, например, вы используете свою переменную в предложении where. Что касается того, почему, я думаю, что это как-то связано с синтаксическим анализатором, который не может оценить переменную и, таким образом, проверить существование. При выполнении запрос сначала анализируется на предмет синтаксиса и объектов, а затем, если анализ выполняется успешно, запрос выполняется, и в этот момент будет установлена переменная.
источник
eval
функций в процедурных языках, таких как JavaScript и Python. Это быстрый способ создать дыры в безопасности.Ограничения на использование переменных в операторах SQL вытекают из архитектуры SQL.
Существует три этапа обработки оператора SQL:
SQL-сервер скрывает этап подготовки от программиста и выполняет его намного быстрее, чем более традиционные базы данных, такие как Oracle и DB2. По причинам производительности SQL тратит потенциально много времени на определение оптимального плана выполнения, но делает это только при первом обращении к оператору после перезапуска.
Таким образом, в статическом SQL переменные могут использоваться только в тех местах, где они не приведут к аннулированию плана выполнения, но не для имен таблиц, имен столбцов (включая имена столбцов в условиях WHERE) и т. Д.
Динамический SQL существует для случаев, когда нельзя обойти ограничения, и программист знает, что выполнение займет немного больше времени. Динамический SQL может быть уязвим для внедрения вредоносного кода, поэтому будьте осторожны!
источник
Как вы можете видеть, вопрос «почему» требует другого типа ответа, включая историческое обоснование и лежащие в основе предположения о языке, я не уверен, что смогу действительно оправдать это.
Эта всеобъемлющая статья SQL MVP Erland Sommarskog действительно пытается дать некоторое объяснение, наряду с механикой:
Проклятие и благословения динамического SQL :
Это (и безопасность, см. Ниже), вероятно, самая большая причина.
SQL работает при условии, что запросы - это не разовые операции, а то, что они будут использоваться снова и снова. Если таблица (или база данных!) Фактически не указана в запросе, она не может сгенерировать и сохранить план выполнения для будущего использования.
Да, не каждый запрос, который мы выполняем, будет использоваться повторно, но это рабочая предпосылка SQL по умолчанию , поэтому «исключения» должны быть исключительными.
Несколько других причин перечисляет Эрланд (обратите внимание, что он явно перечисляет преимущества использования хранимых процедур , но многие из них также являются преимуществами параметризованных (нединамических) запросов):
Опять же, у каждого из них есть сто нюансов, в которые я не буду вдаваться.
источник
Вам нужно использовать динамический SQL
ниже вывод команды print .. как только вы раскомментируете
exec sp_executesql @sqltext
операторы будут фактически выполнены ...источник