Подтвердить что ты не робот

Что такое динамический SQL?

Я просто задал вопрос, связанный с SQL, и первым ответом было: "Это ситуация, когда динамический SQL - это путь".

Как я никогда раньше не слышал о динамическом SQL, я сразу же искал этот сайт и сеть для чего это было. У Википедии нет статьи с этим названием. Первые результаты Google указывают на форумы пользователей, на которых люди задают более или менее связанные вопросы.

Однако я не нашел четкого определения того, что такое "динамический SQL". Является ли это чем-то конкретным поставщиком? Я работаю с MySQL, и я не нашел ссылку в справочнике MySQL (только вопросы, в основном без ответа, на форумах пользователей MySQL).

С другой стороны, я нашел много ссылок на хранимые процедуры. Я немного лучше понимаю, что хранимые процедуры, хотя я никогда не использовал их. Как связаны две концепции? Это одно и то же, или другое?

В принципе, необходимо простое введение в динамический SQL для тех, кто новичок в этой концепции.

PS: Если вам так хочется, вы можете ответить на мой предыдущий вопрос, который подскажет это: SQL: Как мы можем сделать таблицу1 JOIN table2 НА таблице в поле в таблице1?

4b9b3361

Ответ 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, и я не знаю ни одного поставщика, который ее реализовал.