SQL Server - результаты разных функций между Management Studio и пользовательским приложением - PullRequest
0 голосов
/ 06 июня 2018

У меня странная проблема с приложением, которое мы используем в нашей компании.В этом приложении у нас есть инструмент отчета, в котором вы можете указать запрос 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
...