DECLARE @SQL varchar(8000), @table_name varchar(10)
SET @SQL = 'SELECT * FROM ' + @table_name
exec(@SQL)
--или
exec sp_executesql @SQL
Обычно динамические запроса формируются внутри хранимых процедур, в которых по входным параметром составляется конкретная строка выполнения.
Особенности динамического запроса
Динамический запрос ВСЕГДА выполняется В ТОМ-ЖЕ КОННЕКТЕ и КАК ОТДЕЛЬНЫЙ ПАКЕТ(batch). Другими словами при использовании такого запроса,
- вы ни имеете доступа к локальным переменным, объявленым до вызова динамического запроса (однако возможен доступ к cозданным ранее временным таблицам)
- локальные временые таблицы и переменные, созданные во время выполнения команды exec, будут недоступны в вызывающей процедуре, т.к. будут удалены по окончании пакета, в котором выполняется exec.
Динамический запрос ВСЕГДА выполняется с ПРАВАМИ ПОЛЬЗОВАТЕЛЯ, ВЫЗВАВШЕГО ПРОЦЕДУРУ, а не с правами владельца процедуры. Другими словами, если владельцем процедуры Procedure1 является User1, который имеет права к таблице Table1, то для пользователя User2 мало назначить права на выполнение процедуры Procedure1, если обращение в ней к таблице Table1 идет через динамический запрос. Придется давать ему соответствующие права и непосредственно для Table1.
Компиляция запроса происходят непосредственно перед его вызовом. Т.е. обо всех синтаксических ошибках вы узнаете только в этот момент.
Методы компонента ADOTable. Привести примеры.
TADOTable.Locate(const AnsiString KeyFields, const System::Variant &KeyValues, TLocateOptions Options); Ищет в ключевом поле, заданном в переменной KeyFields, значение переменной KeyValues. В случае если совпадение найдено, найденная запись становится текущей, т.е. курсор устанавливается на нее. В переменной Options указывается как преобразовывать значения для поиска может быть: loCaseInsensitive или loPartialKey.
TADOTable.Seek(const Variant &KeyValues, TSeekOption SeekOption =soFirstEQ); Используется при поиске с помощью индексов. SeekOption определяет как поступать если запись найдена: soFirstEQ, soLastEQ, soAfterEQ, soAfter, soBeforeEQ, soBefore. Подробное описание их вы найдете в мануале по Delphi.
TADOTable.LookUp (const AnsiString KeyFields, const Variant &KeyValues, const AnsiString ResultFields); Возвращает в качестве результата набор типа Variant со значениями всех найденных значений, удовлетворяющих запросу.
Существует еще несколько способов поиска информации в таблице: перебор всех элементов вручную, использование FindFirst, Next и т.д. Но мы перечислили только основные и необходимые, на мой взгляд, методы.
Приведем пример использования метода Locate. Поместите на форму компонент TComboBox, TButton и TEdit, занесите в КомбоБокс названия всех полей вашей таблицы (для этого используется свойство Items). В Edit мы будем вводить значение необходимое для поиска, а из ComboBox выбирать поле, по которому осуществлять поиск.