Параметры SQL - где происходит расширение

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

Во-первых, существует ли стандартный формат имен параметров в запросах или эта база данных / промежуточное ПО зависит? Я видел как это:-

DELETE * FROM @tablename    

а также...

DELETE * FROM :tablename

Второе - где (как правило) происходит замена параметра? Заменяются ли параметры / расширяются до того, как запрос отправляется в базу данных, или база данных получает параметры и запрашивает отдельно и выполняет само расширение?

В качестве фона я использую инструментарий DevArt UniDAC из приложения C++Builder для подключения через ODBC к электронной таблице Excel. Я знаю, что это несколько пессимально в нескольких отношениях... (я пытаюсь понять, почему конкретная команда работает только тогда, когда она не использует параметры)

3 ответа

Решение

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

Microsoft всегда использует @parname для параметров. Oracle использует :parname, Другие базы данных разные.

Ни одна база данных, о которой я знаю, не позволяет указывать имя таблицы в качестве параметра. Вы должны расширить эту сторону клиента, например:

command.CommandText = string.Format("DELETE FROM {0}", tableName);

PS A * не допускается после DELETE, В конце концов, вы можете удалить только целые строки, а не набор столбцов.

С такими библиотеками доступа к данным, как UniDAC или же FireDACВы можете использовать макросы. Они позволяют вам использовать специальные маркеры (называемые макросами) в местах команды SQL, где параметр запрещен. Я не знаю UniDAC API, но приведу пример для FireDAC:

ADQuery1.SQL.Text := 'DELETE * FROM &tablename';
ADQuery1.MacroByName('tablename').AsRaw := 'MyTab';
ADQuery1.ExecSQL;

Второе - где (как правило) происходит замена параметра?

Это не так. В этом весь смысл. Элементы данных в вашем запросе остаются элементами данных. Элементы кода остаются элементами кода. Эти два никогда не пересекаются, и, таким образом, никогда не существует возможности для обработки вредоносных данных как кода.

подключиться через ODBC к электронной таблице Excel... Я пытаюсь понять, почему конкретная команда работает только тогда, когда она не использует параметры

Excel на самом деле не является ядром базы данных, но если это так, вы все равно не сможете использовать параметр для имени таблицы.

Другие вопросы по тегам