Что такое динамический SQL?
Я просто задал вопрос, связанный с SQL, и первым ответом было: "Это ситуация, когда динамический SQL - это путь".
Как я никогда раньше не слышал о динамическом SQL, я сразу же искал этот сайт и сеть для чего это было. У Википедии нет статьи с этим названием. Первые результаты Google указывают на форумы пользователей, на которых люди задают более или менее связанные вопросы.
Однако я не нашел четкого определения того, что такое "динамический SQL". Является ли это чем-то конкретным поставщиком? Я работаю с MySQL, и я не нашел ссылку в справочнике MySQL (только вопросы, в основном без ответа, на форумах пользователей MySQL).
С другой стороны, я нашел много ссылок на хранимые процедуры. Я немного лучше понимаю, что хранимые процедуры, хотя я никогда не использовал их. Как связаны две концепции? Это одно и то же, или другое?
В принципе, необходимо простое введение в динамический SQL для тех, кто новичок в этой концепции.
PS: Если вам так хочется, вы можете ответить на мой предыдущий вопрос, который подскажет это: SQL: Как мы можем сделать таблицу1 JOIN table2 НА таблице в поле в таблице1?
Ответы
Ответ 1
Динамический SQL - это просто, где запрос был создан "на лету" - с некоторыми поставщиками вы можете создать текст динамического запроса в одной хранимой процедуре, а затем выполнить сгенерированный SQL. В других случаях термин просто относится к решению, принятому кодом на клиенте (это, по крайней мере, нейтральный поставщик)
Ответ 2
Динамический SQL - это просто оператор SQL, который состоит на лету перед выполнением. Например, следующий С# (с использованием параметризованного запроса):
var command = new SqlCommand("select * from myTable where id = @someId");
command.Parameters.Add(new SqlParameter("@someId", idValue));
Может быть переписан с использованием динамического sql как:
var command = new SqlCommand("select * from myTable where id = " + idValue);
Имейте в виду, что динамический SQL опасен, поскольку он легко позволяет атаковать SQL Injection.
Ответ 3
Другие ответы определили, что такое динамический SQL, но я не видел никаких других ответов, которые пытались описать, почему мы иногда должны его использовать. (Мой опыт - SQL Server, но я думаю, что в этом отношении другие продукты в целом похожи.)
Динамический SQL полезен, когда вы заменяете части запроса, которые нельзя заменить с помощью других методов.
Например, каждый раз, когда вы вызываете запрос, например:
SELECT OrderID, OrderDate, TotalPrice FROM Orders WHERE CustomerID = ??
вы будете передавать другое значение для CustomerID. Это самый простой случай и тот, который может решаться с помощью параметризованного запроса или хранимой процедуры, которая принимает параметр и т.д.
Вообще говоря, следует избегать динамического SQL в пользу параметризованных запросов по соображениям производительности и безопасности. (Хотя разница в производительности, вероятно, сильно варьируется между поставщиками и, возможно, даже между версиями продукта или даже конфигурацией сервера).
Другие запросы можно использовать с использованием параметров, но могут быть проще, чем динамический SQL:
SELECT OrderID, OrderDate, TotalPrice FROM Orders
WHERE CustomerID IN (??,??,??)
Если у вас всегда было 3 значения, это так же просто, как и первое. Но что, если это список переменной длины? Его можно делать с параметрами, но может быть очень сложно. Как насчет:
SELECT OrderID, OrderDate, TotalPrice FROM Orders WHERE CustomerID = ??
ORDER BY ??
Это не может быть заменено напрямую, вы можете сделать это с помощью огромного сложного оператора CASE в ORDER BY, явно перечисляющего все возможные поля, которые могут быть или не быть практичными, в зависимости от количества полей, доступных для сортировки.
Наконец, некоторые запросы просто НЕ МОГУТ сделать с использованием любого другого метода.
Скажем, у вас есть куча таблиц заказов (не говоря о том, что это отличный дизайн), но вы можете надеяться, что сможете сделать что-то вроде:
SELECT OrderID, OrderDate, TotalPrice FROM ?? WHERE CustomerID = ??
Это невозможно, используя другие методы. В моей среде я часто сталкиваюсь с такими запросами, как:
SELECT (programatically built list of fields)
FROM table1 INNER JOIN table2
(Optional INNER JOIN to table3)
WHERE (condition1)
AND (long list of other optional WHERE clauses)
Опять же, не говоря о том, что это обязательно отличный дизайн, но динамический SQL довольно необходим для этих типов запросов.
Надеюсь, что это поможет.
Ответ 4
Динамический SQL - это SQL, построенный из строк во время выполнения. Полезно динамически устанавливать фильтры или другие материалы.
Пример:
declare @sql_clause varchar(1000)
declare @sql varchar(5000)
set @sql_clause = ' and '
set @sql = ' insert into #tmp
select
*
from Table
where propA = 1 '
if @param1 <> ''
begin
set @sql = @sql + @sql_clause + ' prop1 in (' + @param1 + ')'
end
if @param2 <> ''
begin
set @sql = @sql + @sql_clause + ' prop2 in (' + @param2 + ')'
end
exec(@sql)
Ответ 5
Это именно то, что упоминал Роуленд. Чтобы немного рассказать об этом, возьмите следующий SQL:
Select * from table1 where id = 1
Я не уверен, какой язык вы используете для подключения к базе данных, но если бы я использовал С#, то пример динамического SQL-запроса был бы примерно таким:
string sqlCmd = "Select * from table1 where id = " + userid;
Вы хотите избежать использования динамического SQL, потому что становится слишком громоздким, чтобы сохранить целостность кода, если запрос становится слишком большим. Кроме того, очень важный динамический SQL подвержен атакам SQL-инъекций.
Лучшим способом написания вышеприведенного утверждения было бы использование параметров, если вы используете SQL Server.
Ответ 6
Rowland является правильной и в качестве дополнения, если вы не используете параметры (в отличие от простого ввода значений параметров из предоставленного текста и т.д.), это также может представлять угрозу безопасности. Это также медведь для отладки и т.д.
Наконец, всякий раз, когда вы используете неопытный динамический SQL, все происходит, и дети едят.
Ответ 7
Я думаю, что это означает, что вы должны динамически строить запрос перед его выполнением. По другим вопросам это означает, что вы должны сначала выбрать нужное имя таблицы и использовать свой язык программирования для создания второго запроса для выполнения того, что вы хотите (то, что вы хотите сделать в другом вопросе, невозможно прямо, как вы хотите).
Ответ 8
Является ли это чем-то конкретным поставщиком?
В стандарте SQL-92 есть целая глава по динамическому SQL (глава 17), но она применима только к FULL SQL-92, и я не знаю ни одного поставщика, который ее реализовал.