Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос не видит временную таблицу [D7, MSSQL]


Dust ©   (2007-06-30 19:26:00) 

Второй запрос не видит временную таблицу, созданную в первом запросе
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-07-01 22:33:00) [1]

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


sniknik   (2007-07-01 21:17:00) [2]

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

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

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


sniknik   (2007-07-01 20:54:00) [3]

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

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


Dust   (2007-07-01 20:54:00) [4]

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

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


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

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


sniknik   (2007-07-01 19:50:00) [6]

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


Dust   (2007-07-01 19:38:00) [7]

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


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

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


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

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


Desdechado   (2007-07-01 18:06:00) [10]

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


Dust   (2007-07-01 17:07:00) [11]

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


Dust   (2007-07-01 17:07:00) [12]

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

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

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

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


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

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

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

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


sniknik   (2007-07-01 11:09:00) [14]

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

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

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


Dust   (2007-06-30 20:59:00) [15]

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

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


Desdechado   (2007-06-30 20:08:00) [16]

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


Dust   (2007-06-30 19:28:00) [17]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо