StmtStarting без StmtComplete

Шыфл
Дата: 20.01.2009 18:43:36
Доброго времени суток.

В прикладной программе (Ассесс 2003) было решено перевести логику на сервер

(@@version=Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Personal Edition on Windows NT 5.1 (Build 2600: Service Pack 3) )

В процесе отладки обнаружился замечательный эфект, что одна и та же строка переданная через Ассесс (ADO) и запущенная в QA дают разные результаты.
Строка выглядит примерно как
автор
exec dbo.onclick @ID = NULL, @prijmeni = NULL, @rnarozeni= NULL, @status = NULL, @praceod = Null, @pracedo = Null, @vikendy = NULL, @vyjadrschop = 100, @spismluva = 100, @preknamitek = 100, @naslou = 100, @obsahspr = 100, @dodrstandardy = 100, @komunikace = 0, @ZamE = -1, @zak = NULL, @SkupE = 0, @hwnd = 1049876, @od = {d '2008-12-01'}, @do = {d '2008-12-09'}, @chkOper = 0, @chkNaklady = -1, @groupby = 1


Причём наблюдение в профайлере показали, что при запуске через ADO после определённой инструкции (2ой с конца) следующая инструкция начинается (SQL:StmtStarting) но не заканчивается (не зависит от содержания этой инструкции), а все последующие инструкции игнорируются. Причём никакого сообщения об ошибке не вылетает...
Инструкция insert выглядит абсолютно нормально:
   insert into telemhod.dbo.analhodsum(rok,per,zak,oper,hodin,poc_oper,mzdcena,mzdodv,konstnaklad,dovolena,RozpNakl,hwnd)
   select case @groupby when 3 then 0 else datepart(yyyy,datum) end
         ,case @groupby when 4 then datepart(dy,Datum)   
                        when 0 then datepart(wk,Datum)
                        when 1 then datepart(mm,Datum)
                        when 2 then datepart(yyyy,Datum)
                        when 3 then 0 end 
         ,zak
         ,case @chkOper when 0 then NULL else zam end
         ,sum(hodin)
         ,count(distinct(zam))
         ,sum(mzdcena)
         ,sum(mzdodv)
         ,sum(konstnaklad)
         ,sum(dovolena)
         ,sum(RozpNakl)
         ,@hwnd
   from telemhod.dbo.analhod where hwnd=@hwnd
   group by zak
           ,case @chkOper when 0 then NULL else zam end
           ,case @groupby when 3 then 0 else datepart(yyyy,datum) end
           ,case @groupby when 4 then datepart(dy,Datum)   
                          when 0 then datepart(wk,Datum)
                          when 1 then datepart(mm,Datum)
                          when 2 then datepart(yyyy,Datum)
                          when 3 then 0 end 
           ,case @groupby when 3 then NULL else cena end

Причём в случае не правельного поведения профайлер выдаёт сразу SQL:Batch Complete первичной инструкции (exec) без SQL:StmtComplete.

Кто видит суслика?

П.С. Через QA всё работает без проблем, всё выполняется и перед Batch Complete (exec) проходит StmtComplete (exec)
П.П.С. Формат даты не влияет, проверял. Однако при определённых параметрах
Шыфл
Дата: 20.01.2009 18:47:59
Формат даты не влияет, проверял. Однако при определённых параметрах инструкция проходит и через ассесс. Пока зависимостей не обнаружил
Glory
Дата: 20.01.2009 18:58:21
Microsoft SQL Server 2000 - 8.00.194 - практически версия прошлого века. Без единого сервис пака и фикса. Которых за 8 лет выпустили несколько десятков
Crimean
Дата: 20.01.2009 19:26:51
имхо ошибки таки есть. просто профилер их не показывает, а ваша программа - игнорирует. батч старт был, далее было закрытие хендла / снятие батча, разумеется не было официально го завершения батча. все последующие команды пошли "в никуда". все вполне логично
Шыфл
Дата: 20.01.2009 21:44:52
Glory,
Накатил четвёртый сервиспак. Не помогает
Select @@version
Microsoft SQL Server 2000 - 8.00.2050 (Intel X86) Mar 7 2008 21:29:56 Copyright (c) 1988-2003 Microsoft Corporation Personal Edition on Windows NT 5.1 (Build 2600: Service Pack 3)


Crimean,
Эмпирически выяснил, что вылетает когда суммируются Null значения. Сразу же на стедующей команде... :/
Грусно как-то отлавливать все возможные Null, может может можно что-то ещё подкрутить?
Шыфл
Дата: 20.01.2009 21:51:03
Т.е. во время выполнения процедуры в QA вылетает сообщения
SQL Server

Warning: Null value is eliminated by an aggregate or other SET operation.

И это сообщение завершает выполнение батча, запущенного через ADO. Кто-нить сталкивался с подобным поведением?
Crimean
Дата: 20.01.2009 21:52:50
путем изменения ansi settings для соединения можно это предупреждение убрать
Шыфл
Дата: 20.01.2009 22:52:42
Crimean,

Решил найти где процедура таки падает. Создал табличку log1 с 1 полем. В теле процедуры раскидал инсерты аля
insert into dbo.log1 (pozn) values ('a1')
----
insert into dbo.log1 (pozn) values ('a2')
------

Запустил.
Процедура срабатывает без ошибок там, где до этого падала...

Или лыжы не едут или одно из двух...
pkarklin
Дата: 21.01.2009 08:43:05
Теряюсь в сомнениях, а если во первых словах процы SET NOCOUNT ON?
Шыфл
Дата: 21.01.2009 16:45:31
Всё оказалось намного проще.

Процедура по ходу исполнения выдавала рекордсет (строки для которых не заполнены определённые параметры), но это происходило где-то в середине процедуры.

QA это совершенно не мешает закончить батч, а вот Access (ADO) после получения этого рекордсета начинает танцы с саблями и завершает выполнение батча преждевременно, непонятно в каком месте и непонятно по какой причине, причём без сообщения об ошибке. Батч просто заканчивался "на полуслове" так сказать - очивидно после получения рекордсета ADO cчитает миссию выполненой и закрывает соединение согласно каким-то странным способом, на что сервер отвечает прерыванием батча.

После того, как выдачу рекордсета перенёс вконец, всё работает корректно.

П.с. Когда расставлял метки, этот селект просто закоментил как несущественны. А оно возьми да и заработай. :)