Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Запрос не видит временную таблицу   Найти похожие ветки 

 
Dust ©   (2007-06-30 19:26) [0]

Второй запрос не видит временную таблицу, созданную в первом запросе
QrySP_open.SQL :=
//--------------------------
BEGIN TRANSACTION ZarplataReport;

if exists (select * from tempdb.dbo.sysobjects where id = object_id(N"[tempdb].[dbo].[ #per_tmp_ZarplataUFtable]"))
drop table #per_tmp_ZarplataUFtable

CREATE TABLE #per_tmp_ZarplataUFtable(
   [FK_TypeWork] [int] NULL,
 [nameTypeWork] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
 [FK_TypeDelo] [int] NULL,
 [nameTypeDelo] [varchar](60) COLLATE Cyrillic_General_CI_AS NULL,
 [FK_User] [int] NULL,
 [UserFIO] [varchar](65) COLLATE Cyrillic_General_CI_AS NULL,
 [CountForUser] [int] NULL, --сумма в рублях
 [CountForUserYear] [int] NULL, --сумма в рублях
 [WorkPrice] [money] NULL,
 [SummForUser] [money] NULL, --сумма в рублях
 [SummForUserYear] [money] NULL --сумма в рублях
) ;

exec  dbo.per_ZarplataReportUF :BeginDate, :EndDate, :BeginYearDate, :EndYearDate
//---------------------------------

Второй запрос:
QrySelectDataUF.SQL :=
---Упрощённая форма (Операторы ПВМ)
select *
from #per_tmp_ZarplataUFtable
where FK_TypeWork = 1
order by  FK_TypeWork, FK_TypeDelo, UserFIO;

Второй запрос не видит временную таблицу #per_tmp_ZarplataUFtable, созданную в первом запросе.
Можно ли его заставить его её видеть, и если можно то как?


 
Dust ©   (2007-06-30 19:28) [1]

QrySP_open.Parameters.ParamByName("BeginDate").Value := DTPckrBeginDate.DateTime;
QrySP_open.Parameters.ParamByName("EndDate").Value := DTPckrEndDate.DateTime;
QrySP_open.Parameters.ParamByName("BeginYearDate").Value := DTPckrBeginDate.DateTime;
QrySP_open.Parameters.ParamByName("EndYearDate").Value := DTPckrEndDate.DateTime;

QrySP_open.Open(); //return all
QrySelectDataUF.Open(); //Exception


 
Desdechado ©   (2007-06-30 20:08) [2]

Может, они в разных транзакциях?


 
Dust ©   (2007-06-30 20:59) [3]

Локальные временные таблицы существуют до тех пор пока существует соединение с SQL Server"ом, в котором эти таблицы были созданы и автоматически уничтожаются при его закрытии.

т.е., насколько я понимаю пока я не закрыл AdoConnection временная таблица должна существовать. Причём тут транзакции?


 
sniknik ©   (2007-07-01 11:09) [4]

вообще у временной таблицы как и у переменных есть область видимости, процедура например. т.е. сделанную в одной процедуре в другой (и извне не увидишь)
> exec  dbo.per_ZarplataReportUF :BeginDate, :EndDate, :BeginYearDate, :EndYearDate
а вот это у тебя случаем не процедура? в которой и создается временная таблица. из показанного кода ничего не понять, какието разрозненные, надерганные с разных мест куски.

если нужны таблицы с общей видимостью то делай их глобальными (2 символа # вместо одного)

> пока я не закрыл AdoConnection временная таблица должна существовать.
он может закрываться и сам, когда не нужен, есть свойство коннекта "кипконнектион"  указывает поддерживать его или нет.


 
Павел Калугин ©   (2007-07-01 13:34) [5]

Откуда запускаешь? в qwery analizer тот же результат?

Смотреть внимательно в процедуре есть ли там  
drop table #per_tmp_ZarplataUFtable

что между exec и select?


 
Dust ©   (2007-07-01 17:07) [6]

2 sniknik Временная таблица создаётся в первом запросе, в нём же выполняется вызов хранимой процедуры. Оба запроса приведены в порядке исполнения. ADOConnection1.KeepConnection =true;

2 Павел Калугин
все запросы проверялись перед загоном в делфю в qwery analizer"е
внутри хранимой процедуры drop table нет.

Если все селекты загнать в один ADOQuery, в котором создаётся временная таблица и выполняется хранимая процедура, то всё работает, соотвественно в квери аналайзере всё тоже работает.

вообще в проекте есть всего пять запросов, первый из них содаёт временную таблицу и вызывает хранимую процедуру, остальные 4  должны выбирать данные из временной таблицы. Привожу в порядке выполнения.
   QrySP_open: TADOQuery; //создаёт таблицу, вызывает хранимую процедуру
   QrySelectDataUF: TADOQuery; //выбирает из временной таблицы, которую же и не видит
   QrySelectDataPhoto: TADOQuery;
   QrySelectDataProv: TADOQuery;
   QrySelectDataArchiv: TADOQuery;


 
Dust ©   (2007-07-01 17:07) [7]

Что я недопонимаю, что может быть не так?


 
Desdechado ©   (2007-07-01 18:06) [8]

> вообще в проекте есть всего пять запросов,
ADOConnection у них общий или у каждой прописана строка подключения?


 
Dust ©   (2007-07-01 18:27) [9]

2Desdechado ADOConnection у них общий


 
Gadenysh   (2007-07-01 19:11) [10]

а к чему это  BEGIN TRANSACTION в данном случае?


 
Dust ©   (2007-07-01 19:38) [11]

BEGIN TRANSACTION было добавлено в порядке экперимента, чтобы всё выполнять внутри одной транзакции, а так - оно там не нужно, и соотв ничего не меняет


 
sniknik ©   (2007-07-01 19:50) [12]

> BEGIN TRANSACTION было добавлено в порядке экперимента
для экспериментов надо не добавлять, а убирать все лишнее...
попробуй сделай "чистое" приложение куда добавь связанные 1 коннект и 2 компонента - ADOCommand и ADODataSet (а вовсе не TADOQuery) в первый положи запрос создания таблицы во второй ее открытие, без всяких лишних вещей типа вызова процедур, транзакций...
с таким минимумом работает?


 
Dust ©   (2007-07-01 20:13) [13]

Кажется на вопрос "почему " я  нашёл ответ.
Запустил SQL Profiler и посмотрел AUDIT Login. Перед выполнением второго запроса происходит очередной "лог ин"... Но как это побороть я пока не знаю... вообще это выглядит весьма странно, так как ADOConnection - только один.....


 
Dust ©   (2007-07-01 20:54) [14]

Вопро "Как побороть - решён"

ADOConnection.CursorLocation := clUseClient;
ADOQuery.CursorLocation := clUseClient;


 
sniknik ©   (2007-07-01 20:54) [15]

> Кажется на вопрос "почему " я  нашёл ответ.
с самого начала говорили, что коннект может не держаться... (может конечно причину не совсем ту указали...)

вообще это не ответ на "почему", это подтверждение догадок того "что происходит", а вот как только найдешь "почему" так и ответишь на "что делать".


 
sniknik ©   (2007-07-01 21:17) [16]

> Вопро "Как побороть - решён"
> ADOConnection.CursorLocation := clUseClient;
> ADOQuery.CursorLocation := clUseClient;

решен неверно, причину ты так и не нашел, а если и заработало то не изза этих параметров (возможно от пере создания компонент с установкой чегото по дефаулту, либо ошибка вовсе не ту озвучил)

замечательно работает и с серверным курсором, только что проверил.


 
Dust ©   (2007-07-01 22:33) [17]

Вернусь к этому вопросу чуть позже. Мне до утра надо 2 отчётика сделать.



Страницы: 1 вся ветка

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
2-1192626983
Elec3C
2007-10-17 17:16
2007.11.11
Inc, Dec.


2-1192627288
Sonia
2007-10-17 17:21
2007.11.11
Зацикливание при иерархическом запросе


2-1192899324
Виктор007
2007-10-20 20:55
2007.11.11
Изменение цвета контрола с использованием манифеста XP


2-1192779942
alll_23
2007-10-19 11:45
2007.11.11
TTreeNode


2-1192460244
Dns
2007-10-15 18:57
2007.11.11
Как по Sender-y определить Родителя?