![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли работать с временной таблицей (напр. #tmp_tab_name ) через Ttable? [D3, MSSQL 6.5]
Nest © (2001-11-29 12:32:00)Когда в св-ве Table1.TableName значение,начинающееся с #(т.е. временная таблица), при попытке table1.Createtable ругается "Инвалид табле наим", а при Table1.open -
"table does not exist,
Ivalid object name "#view1"". Хотя в этом сеансе таблица точно создана через Query(кстати с его помощью выбирается)
Несудьба ?
NewComer (2001-12-10 17:05:00) [1]Я конечно не специалист, но Несколько мыслей:
Вообще через БДЕ работать с серваком.. енто как то ракообразно.
DataBase.Execute должен сработать(ежели ты запросом создашь временную табличку.. то точно ее потом не увидишь), поковыряйся что ли.. DataBase.FlushSchemaCache - посмотри.. мож сработает после него...
вообще.. поныкайся с глобальными временными табличками.. посмотри, их то видно? И вообше, локальную временную табличку должна создать сессия. т.е. коннект(в данном случае TDataBase).. если например создать ее в SP то только эта SP ее и видит.. и потом уничтожит... не знаю как получше то выразиться.. :-( Ну и конечно лучше отказаться от TTable в пользу TQuery..
Nest (2001-12-10 16:23:00) [2]Да блин, второй абзац адресован NewComer ©.
Nest (2001-12-10 16:21:00) [3]2Roma
Всё верно.
2Nest
За совета конечно спасибо, но:
1.В Д3DataBase1.Executeработать не хочет
2.Проблема не в том чтоб создать врем. таблицу - это можно и запросом сделать.
Проблема потом эту таблицу открыть с пом. Ттабле.
Но, видать, вправду такие попытки обречены...
NewComer (2001-12-10 12:54:00) [4]Попробуй так.
у TDataBase есть метод Execute....
DataBase1.Execute("Create table #tblTemp(a int, b varchar(30))"); и потом по имени обращайся к этой табличке.. вообще то временыые таблички видны сессии, которая их создала.
У меня все заработало когда юзал TAdoConnection.Execute... вроде и сча должно...
Roma (2001-12-10 11:56:00) [5]> Ега (30.11.01 09:36)
Еслиselect into- это в плане временная будет таблица или нет еще ничего не значит. Чтобы создаваемая таблица была временной, необходимо при создании (select into- тоже создание таблицы) указывать имя таблицы, начинающееся на #.
Временная таблица создается в tempdb с именем не совсем тем, что вы укажете при ее создании; например, если укажете #mytemptable, создастся таблица с именем #mytemptable плюс длиннючее идентифицирующее окончание. И доступна она будет только для того пользователя и того сеанса, при котором была создана.
2Nest>
Может, стоит перенести часть работы в хранимую процедуру... И еще: правильно делаешь, что прислушиваешься к asafr и переходишь на TQuery, юзать MSSQL с помощью TTable - "это же не наш метод"...
Nest (2001-12-10 11:24:00) [6]ДАДАДА!!!
Но сеанс действительно должен быть завершён.
Если ты работаешь в интерактиве- то например перезапустить клиента, а если через дельфи - то недостаточно просто закрыть таблицу. Надо делать connection:=false толи у Database толи у Session.
Но удаляются точно!
Ега (2001-11-30 09:36:00) [7]Nest, а временные таблицы точно автоматически удаляются при закрытии сеанса? По-моему нет, т.к. я сколько раз уже натыкался: делаешь Select into, а тебе Object exists
Nest (2001-11-29 15:36:00) [8]Буду пытаться заменить Ттабле на Ткьюери.
%(
sudiv (2001-11-29 15:33:00) [9]М-да, я тем более не спец.
Тогда я поднимаю руки.
Не знаю.
Nest (2001-11-29 15:27:00) [10]2sudiv ©
Видишь ли, временные таблицы - это не просто таблицы,которые ты создаёшь,юзаешь а потом мочишь.
В МССКЛ это отдельный вид и они серьёзно отличаются.
1.Они создаются для сеанса,и когда подключение к базе разрывается(штатно ИЛ НЕ ШТАТНО) то не надо заботиться об их уничтожении- за это отвечает сервер.
2.Мне временные таблицы необходимы для формирования НД,отображаемого
пользователю при просмотре-
А теперь представь, что пользователь не сможет просмотреть данные из базы если у него есть только права на просмотр (врем.таблицу та нельзя будет создать)!!!!!!!!!!!!!!!!
А таблицу с # создать можно всегда- они по-моему создаются даже в отдельной базе "TeMP"
3.Оператор
SELECT * INTO temp_table_name FROM source_table_name
Обычно не срабатывает, если не открыты специфические права(опции базы),которые обычно закрыты.
однако
SELECT * INTO #temp_table_name FROM source_table_name
сработает всегда.
может где соврал-не спец я по МССКЛ.
Ну, в общем, поменять название таблицы нельзя.
sudiv (2001-11-29 15:06:00) [11]Пробовал,
действительно TTable не "берет" таблицы названия которых c #.
Ничего уж не поделаешь.
А поменять название таблицы нельзя ?
Например tmp3222~.<что-то>.
asafr (2001-11-29 14:50:00) [12]Брось TTable - пользуйся TQuery. Все получится.
Nest (2001-11-29 14:21:00) [13]Как бы узнать по-точнее?
Уж если здесь люди не знают...
sudiv (2001-11-29 13:29:00) [14]Похоже на то.