У меня странная проблема с приложением, которое мы используем в нашей компании.В этом приложении у нас есть инструмент отчета, в котором вы можете указать запрос SQL, но проблема в том, что этот запрос дает разные результаты для точно такого же запроса , запущенного в SQL Management Studio.
ВВ этом запросе я использую «Табличную функцию», где, я думаю, это главная проблема, но я просто не понимаю, почему это будет вести себя по-другому.
Я запускаю следующий код (некрасиво, для устранения различий):
delete from temptabel;
insert into temptabel ( werknemer, werknemerID, van, vanDatum, tot, activiteit, verlofMethode)
select werknemer, werknemerID, van, vanDatum, tot, activiteit, verlofMethode from TabelVerlofdagen(datefromparts(2018, 05, 01), datefromparts(2018, 05, 31)) order by werknemer, van;
Если я запускаю это в SQL Management Studio, он заполняет «шаблон» 219 строками (хорошо!).
Если я запускаю точно такой же код в стороннем программном средстве, он заполняет «шаблон» 195 строками (плохо!).
Как это возможно?
Код от использования табличной функции следующий:
USE [Timetell]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[TabelVerlofdagen]
(
@vanHier Date,
@totHier Date
)
RETURNS
@DagenTabel TABLE
(
werknemer varchar(50),
werknemerID int,
van DateTime,
vanDatum DateTime,
tot DateTime,
activiteit varchar(50),
verlofMethode int
)
AS
BEGIN
DECLARE @verlof_ID INT
DECLARE DeCursor CURSOR FOR
SELECT TT_EMP_BOOK.TT_EMP_BOOK_ID from TT_EMP_BOOK
OPEN DeCursor
FETCH NEXT FROM DeCursor INTO @verlof_ID
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @i INT = (select DAY(TT_EMP_BOOK.TT_TODATE-TT_EMP_BOOK.TT_FROMDATE)
from TT_EMP_BOOK
where (TT_EMP_BOOK.TT_STATUS = 0 or TT_EMP_BOOK.TT_STATUS = 1 or TT_EMP_BOOK.TT_STATUS = 2)
and TT_EMP_BOOK.TT_EMP_BOOK_ID = @verlof_ID and (TT_EMP_BOOK.TT_FROMDATE >= @vanHier or (TT_EMP_BOOK.TT_FROMDATE < @vanHier and TT_EMP_BOOK.TT_TODATE >= @vanHier)))
WHILE (@i > 0)
begin
WITH tempTabel(werknemer, werknemerid, van, vandatum, tot, activiteit, verlofMethode)
AS (
SELECT TT_EMP.TT_NAME as werknemer, TT_EMP.TT_EMP_ID as werknemerid, TT_EMP_BOOK.TT_FROMDATE as van, dateadd(d, @i-1, TT_EMP_BOOK.TT_FROMDATE) as vandatum, TT_EMP_BOOK.TT_TODATE as tot, TT_ACT.TT_NAME as activiteit, TT_EMP_BOOK.TT_METHOD as verlofMethode
FROM TT_EMP_BOOK, TT_ACT, TT_EMP
WHERE TT_ACT.TT_ACT_ID = TT_EMP_BOOK.TT_ACT_ID and TT_EMP_BOOK.TT_EMP_BOOK_ID = @verlof_ID
and TT_EMP_BOOK.TT_EMP_ID = TT_EMP.TT_EMP_ID )
INSERT @DagenTabel
SELECT werknemer, werknemerid, van, vandatum, tot, activiteit, verlofMethode
FROM tempTabel where vandatum <= @totHier and vandatum >= @vanHier and datepart(dw, vandatum) <> 7 and datepart(dw, vandatum) <> 1
set @i = @i-1
END
FETCH NEXT FROM DeCursor INTO @verlof_ID
END
CLOSE DeCursor
DEALLOCATE DeCursor
update @DagenTabel set van = DateAdd(hh, 8, van), tot = DateAdd(hh, 12, tot) where verlofMethode = 6
update @DagenTabel set van = DateAdd(hh, 13, van), tot = DateAdd(hh, 17, tot) where verlofMethode = 7
update @DagenTabel set van = DateAdd(hh, 8, vandatum), tot = DateAdd(hh, 17, vandatum) where verlofMethode = 0
RETURN
END
GO