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