-
Здравствуйте. Вопрс в следующем: на MSSQL есть процедура, которую выполняю посредством компонентов ADO (Delphi5). На выполнение требуется максимум 6 сек. Процедура возвращает набор данных. На этапе разработки (Active:=True) отрабатывает нормально. При запуске программы выдает ошибку commandtext does not return result set. Использовал по очереди компоненты TADOQuery, TADOStoredProc,TADoDataSet. Результат-та же ошибка. Запрос перехваченный трассировщиком и запущенный на MSSQL возвращает данные. Урезал процедуру до минимума - выдает не те данные но быстро - около 1 сек. В этом случае все работает - но результаты не те. Впечатление будто если процедура не вложилась в секунду то все. Подскажите как быть.
-
Код запуска в делфи и текст хранимки сюда
-
1. Как вызываете процедуру 2. Покажите текст процедуры
-
1.Процедура возвращает данные о всех работников предприятия Состоит из запроса в несколько таблиц и изменения последней даты перемещения на первую дату перемещения на данную профессию.
ALTER PROCEDURE ot_ARM(@FD datetime)
AS
Select r.TabN ,Famil+' '+Imya+' '+Otchectv as F ,Mug_Gen ,convert(varchar(10),convert(datetime,Dat_rogd),104) as DR--'Дата рожд.' ,f.Name+' '+isnull(r.Razr,'') as PR--'Профессия' ,d.Name as PD--'Подразделение' ,Tel --as 'Телефон' ,p.Iden_kod --as 'Иден.код' isnull(ltrim(Obl+' '),'')+isnull(ltrim(Gorod+' '),'')+isnull(ltrim(Reg+' '),'')+ isnull(ltrim(Der+' '),'')+isnull(ltrim(Ul+' '),'')+ isnull(Dom+' ','')+isnull(ltrim(Korp+' '),'')+isnull(Kv,'') as ADR--'Адрес' ,convert(varchar(10),convert(datetime,ar.DFPer),104) DS--'Дата поступл.' ,convert(varchar(10),convert(datetime,r.DFPer),104) DD--as 'Дата перемещ.' ,r.KodProf,r.Razr,r.DFPer as DP into #TMP from PersPeremNew ar ,Personal p ,PersData t ,PersPeremNew r ,Sperem rn ,SpodrN d ,SprofN f where ar.VidDog not in(3,5,7,8,6) and ar.DFPer in(select Max(DFPer) from PersPeremNew where Iden_kod=p.Iden_kod and VidPer=1 and DFPer<=@FD) and ar.VidPer=1
and t.InsDate in(select Max(InsDate) from PersData where Iden_kod=p.Iden_kod and InsDate<=@FD) and r.VidPer=rn.Id and rn.PrCnst>=1 and r.DFPer in(select Max(DFPer) from PersPeremNew,Sperem where Iden_kod=p.Iden_kod and Id=VidPer and VidPer<>2 and PrCnst>=1 and DFPer<=@FD) and r.VidPer<>2
and d.KeyPodr=r.KodPodr and f.KeyProf=r.KodProf and ar.Iden_kod=p.Iden_kod and ar.Iden_kod=t.Iden_kod and ar.Iden_kod=r.Iden_kod and p.Iden_kod not in(select Iden_kod from PersPeremNew uv1 where VidPer=2 and DNDog=ar.DFPer and DFPer<=@FD) order by Famil,FIO
while exists( select t.Iden_kod from #tTMP t, (select t.Iden_kod,max(DFPer)as DFP,DP from PersPeremNew n,#tTMP t,Sperem where t.Iden_kod=n.Iden_kod and VidPer=Id and PrCnst=1 and DFPer<DP group by t.Iden_kod,DP)n,PersPeremNew m,Sperem where t.Iden_kod=m.Iden_kod and t.Iden_kod=n.Iden_kod and m.VidPer=Id and PrCnst=1 and DFP=m.DFPer and m.KodProf=t.KodProf and isnull(m.Razr,'')=isnull(t.Razr,'') )
update t set t.DP=DFP from #tTMP t, (select t.Iden_kod,max(DFPer)as DFP,DP from PersPeremNew n,#tTMP t,Sperem where t.Iden_kod=n.Iden_kod and VidPer=Id and PrCnst=1 and DFPer<DP group by t.Iden_kod,DP)n,PersPeremNew m,Sperem where t.Iden_kod=m.Iden_kod and t.Iden_kod=n.Iden_kod and m.VidPer=Id and PrCnst=1 and DFP=m.DFPer and m.KodProf=t.KodProf and isnull(m.Razr,'')=isnull(t.Razr,'')
select TabN as 'Таб.№',F as 'ФИО',Mug_Gen as 'Пол',DR as 'Дата рожд.',PR as 'Профессия', PD as 'Подразделение',Tel as 'Телефон',Iden_kod as 'Иден.код',ADR as 'Адрес', DS as 'Дата поступл.',convert(varchar(10),convert(datetime,DP),104) as 'Дата перемещ.' from #tTMP order by F
GO
2. ADOQuery.SQL ot_ARM :Dt
-
и сколько этот ужос из QA выполняется?
-
Это MSSQL 2005 ? какая версия MDAC? попробуйте подключится через Native Client
-
> Это MSSQL 2005 ?
На каком основании Вы так думаете и какое это имеет значение?
-
MSSQL 2000 MDAC 2.8 SP1
-
> MSSQL 2000 MDAC 2.8 SP1 >
Сколько секунд идёт выполнение из Query Analyzer?
-
6 сек.
-
Чему равно значение TADOConnection.CommandTimeout на клиенте?
-
30 (по умолчанию)
-
ALTER PROCEDURE ot_ARM(@FD datetime = 0) Если так, то что?
-
в Query Analyzer через 1 сек. пустой результат ;с программы - та же ошибка ; из среды разработки как в Query Analyzer
-
Дело даже не во времени выполнения процедуры. После того, как я убрал создание временной таблицы и цикл, но удлинил время выполнения процедуры путем выполнения 'левых' запросов до 9 сек. она отрабатывает с программы.
-
> ADO (Delphi5)
Древнее Delphi не нашел? Update для ADO установлен?
SET NOCOUNT ON поставь в процедуре.
-
а чему равно значение параметра- даты, при перехвате запроса через профайлер?
-
> SET NOCOUNT ON поставь в процедуре.
Кстати да, у тебя же там Update есть...
-
строка, отображаемая в профайлере: exec sp_executesql N'exec ot_ARM @P1 ', N'@P1 datetime', 'Jun 20 2008 12:00:00:000AM'
строка SET NOCOUNT ON , добавленная в процедуру - помогла.
всем откликнувшимся большое спасибо!
|