![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL. Замучился искать в доках!!! Хелп!!! Можно ли в переменную...
@andrew © (2002-11-19 17:32:00)запихнть имя таблицы и поля? Т.е. select Переменная1(varchar) from Переменная2(varchar) where... и и.д.
BlackTiger (2002-12-04 02:12:00) [1]Если быть точнее, то
----------------------------------------
DECLARE @sql varchar(2000), @table_name varchar(30)
DECLARE @field_name varchar(30)
SET @table_name = "MyTable"
SET @field_name = "MyField"
SET @sql = "SELECT [" + @field_name + "] FROM [" + @table_name + "] ORDER BY [" + @field_name + "]"
EXEC(@sql)
END
----------------------------------------
BlackTiger (2002-12-04 02:07:00) [2]andrew !!!
Как это нельзя!
-------------------------------------------
BEGIN
DECLARE @sql varchar(2000)
SET @sql = "SELECT * FROM MyTable ORDER BY MyField"
EXEC(@sql)
END
-------------------------------------------
По такому принципу у меня работает crosstab-выборка. Разве это не то? Динамически формируешь запрос и вперед с песнями!
@andrew (2002-12-03 21:00:00) [3]Прошу прощения за то, что забросил конференцию, просто и сам понял, что вроде нельзя и сделал другой алгоритм. Речь вообще не шла о Делфи. Мне нужно этот запрос разместить в самом SQL в триггерах. А потому SQL.Add("... и т.д. , ну вы понимаете :-)
А задача была такова:
1. Есть таблицы разные :-)
2. Есть отдельно стоящая таблица:
|| Table_name || KEY_FIELD ||
, где Table_Name имена таблиц пункта 1., а KEY_FIELD - то поле, по которому надо делать select в таблице Table_Name :-)
Вот такая навороченная штука :-) В общем, не так как хотелось бы, но вопрос решил. Огромное Спасибо Всем!
pivo_est (2002-11-21 06:26:00) [4]procedure XXX;
var S1,S2: string;
begin
S1:=NNN;
S2:=MMM;
.........
Query1.SQL.Add("SELECT "+S1+"FROM "+S2);
.........
end;
Sergey13 (2002-11-20 09:45:00) [5]2@andrew © (19.11.02 17:32)
>Можно ли в переменную запихнть имя таблицы и поля
Для SQL серверов имя таблицы, ИМХО, нельзя. Имя поля можно, но только в order by секции(так как это в принципе к логике запроса не относится и влияет только на сортировку вывода => обрабатывается после выполнения запроса).
Как примерно происходит обработка запросов на сервере.
1- синтаксический разбор. Если все нормально, то
2- проверка прав доступа. Если нормально, то
3- компиляция запрса. Если нормально, то
4- связывание переменных. Если нормально, то
5- выполнение запроса.
Если имя таблицы в перменной, то п2. невозможен так как привязка произойдет только в п.4 => ошибка.
Если имя поля в переменной, то невозможно выполнить даже п.1.
Выход, ИМХО один, - формирование ПОЛНОЙ строки запроса на клиенте (или в хр.поцедуре). Так что sniknik © прав.
Andrey Primkulov (2002-11-20 05:27:00) [6]В FibPlus (это конечно для IB/FB/YA) есть такое понятие как макросы(макроподстановки).
BlackTiger (2002-11-19 19:34:00) [7]КАААнэчно! В MSSQL.
Для таких вещей есть динамический SQL.
//1 вариант
//---------
Query1.SQL.Clear;
Query1.SQL.Add("EXEC(""SELECT Field1, Field2 FROM "+TableName+""" ORDER BY Field1)")
Query1.Open;
//2-ой вариант
То же самое, но реализуется на сервере через хранимые процедуры или функции.
CREATE PROCEDURE sp_GiveMeSomeData(@table_name varchar(100))
AS
BEGIN
EXEC("SELECT * FROM " + @table_name)
END
Val (2002-11-19 18:17:00) [8]я и говорю, что опять гадаем, что не есть хорошо. а автор на вопросы к нему не отвечает.
sniknik (2002-11-19 18:09:00) [9]Val © (19.11.02 17:57)
Автор
>Можно ли в переменную... запихнть имя таблицы и поля?
я так понял, что значит переменная для запроса? по моему параметр.
а про составной селект вопроса не было (но ответы все же есть).
Val (2002-11-19 17:57:00) [10]>sniknik © (19.11.02 17:44)
не стоит говорить так категорично - про параметры речи не шло, а составить строку запроса можно как в SQL-серверах, поддерживающих динамический SQL(Оракловский EXECUTE IMMEDIATE, например), так и в тексте OP, конкатенируя строки.
valnech (2002-11-19 17:51:00) [11]SQL.Add(Format(SELECT %s FROM %s WHERE %s = %s,[sVar1, sVar2,sVar3,sVar4]));
Asderg (2002-11-19 17:48:00) [12]если в дельфях запрос собираешь (строчку), то программно пихай то, что нужно (названия таблиц). имхо проще будет
Asderg (2002-11-19 17:44:00) [13]помнится, читал статью про оракл, где эта проблема расписывалась (ее решение). много было написано.... 8) "...как формировать данные для оператора SELECT программно..."
другие способы поищи.
если есть желание могу по мылу статью выслать.
sniknik (2002-11-19 17:44:00) [14]да в любой по моему не дозволительны имена таблиц в параметрах. (если только строку из параметра формировать и в OpenDataSource передавать, можно по моему но только MSSQL)
Val (2002-11-19 17:35:00) [15]где должен работать данный скрипт? какая бд?