Какие готовые заявления?Чем они отличаются от динамического SQL? - PullRequest
2 голосов
/ 24 августа 2010

Я не видел дублирующих вопросов, но задавался вопросом, может ли кто-нибудь привести несколько хороших примеров и особенно лучшие практики по этим вопросам.

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Подготовленные операторы - это предварительно скомпилированные операторы, с которыми вы можете запускать несколько раз в базе данных, и SQLServer не будет анализировать или генерировать другой план выполнения при каждом его запуске. Обычно вы запускаете подготовленный оператор в контексте клиента (используя JDBC, ADO.NET, ODBC или любую другую технологию клиентского доступа).

Подготовленный оператор в Java (конечно, с использованием JDBC) будет выглядеть примерно так:

PreparedStatement ps = conn.prepareStatmente("insert into t(field1) values (?)");
ps.setString(1, "Hello");
ps.executeUpdate();
ps.setStrgin(2, "World");
ps.executeUpdate();
ps.close();
// two rows will be inserted into table t:
// field1 => "Hello"
// field1 => "world"

Динамический SQL - это возможность запустить любое предложение SQL, сохраненное в динамической переменной (то есть строке), внутри хранимой процедуры или функции в SQLServer. Вы можете найти несколько примеров в приведенной ссылке.

1 голос
/ 24 августа 2010

Было бы проще объяснить с некоторым контекстом ...

В Java, PreparedStatements являются операторами SQL в строке Java и поддерживают заполнители, которые можно заполнять, не беспокоясь о экранировании одногоцитаты. .NET также имеет синтаксис PreparedStatement :

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

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

Синтаксис динамического SQL в MySQL также называется PreparedStatements ...

Динамический SQL

ДинамическийSQL - это в основном любой SQL, объявленный как строковый тип данных - его можно настроить перед выполнением.Необходимость использования динамического SQL возникает тогда, когда вы хотите делать такие вещи, как динамические ссылки на столбцы и / или таблицы.Например, ни один SQL не поддерживает строковую переменную для представления таблицы в предложении FROM (табличные переменные являются исключением, где они поддерживаются).

Важно знать разницу между EXEC и EXEC sp_executesql в отношении динамического SQL на SQL Server.EXEC sp_executesql был добавлен в SQL Server 2005, и вы можете прочитать больше о динамическом SQL на SQL Server в превосходной статье: Проклятие и благословения динамического SQL

0 голосов
/ 24 августа 2010

PreparedStaement - это языковая конструкция, которая предоставляет предварительно скомпилированные запросы, которые уже были объяснены в ответах выше. Одним из очень важных преимуществ использования подготовленных операторов является то, что они избавляют вас от вредоносных SQL-атак. Как? у вас есть только местозаполнитель, в который вы можете ввести значения, и нет другого способа изменить запрос (предварительно скомпилированный), тогда как в случае операторов вы можете изменить строку запроса. Пример:

У меня есть запрос на обновление таблицы -

UPDATE table_name SET col1 = 40 WHERE id = 'A001';

Это может быть изменено (злонамеренно) как -

UPDATE table_name SET col1 = 40 WHERE id = 'A001'; DROP TABLE table_name;

И твой стол исчез!

Динамические запросы - это структура базы данных, которая помогает вам написать запрос, в котором вы можете использовать переменные связывания, а не значения. Они особенно используются в коде PL / SQL. Также полезно при выполнении операторов DDL. Пример кода (Oracle):

ip_job_name := 'APP_EXTRACT'; lv_query := 'SELECT 1 FROM user_table WHERE table_name = :tab_name';</p> <p>BEGIN</p> <p>EXECUTE IMMEDIATE lv_query INTO lv_tab USING ip_job_name;</p> <p>EXECUTE IMMEDIATE 'DROP TABLE ' || ip_job_name;</p> <p>EXCEPTION</p> <p>WHEN NO_DATA_FOUND THEN NULL;</p> <p>END;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...