2015-11-06 4 views
-1

я хранимая процедура, в которой возвращает таблицу, содержащую date, presence, total working hour если присутствуют ...данные возврата, даже если они являются ошибками

Total Working Hour рассчитывается в отдельной функции, которые возвращают десятичное значение , Но иногда у служащих есть ошибки в данных, например, дублирующие удары или перфорации (из или в) в течение двух раз,
, если какой-либо из вышеперечисленных сценариев существует, функция возвратила ошибку, и поэтому ошибка возврата SP ...

Мой запрос - когда возникает какая-либо ошибка, я хочу вернуть 0 или -1 или что-то другое вместо ошибки, чтобы заставить SP возвращать данные, даже если они являются ошибками.
Генерация ошибки каждый раз:

SQL Server Subquery returned more than 1 value. 
This is not permitted when the subquery follows =, !=, <, <= , >, >= 

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

СП кодекс:

ALTER PROCEDURE [dbo].[SM_GetAttendance] 
(
    @StartDate date , 
    @EndDate date , 
    @EmployeeID NVARCHAR(6) 
) 
AS 
BEGIN 

    SET NOCOUNT ON; 
DECLARE dte_Cursor CURSOR FOR 
WITH T(date) 
AS 
( 
SELECT @StartDate 
UNION ALL 
SELECT DateAdd(day,1,T.date) FROM T WHERE T.date < @EndDate 
) 
SELECT date FROM T OPTION (MAXRECURSION 32767); 

    DECLARE @date NVARCHAR(20); 
    CREATE TABLE #datetable(date DATETIME,Status NVARCHAR(50),nbOfWorkingHour DECIMAL(36,2)) 

--SELECT date FROM T 
set @date = '' 
OPEN dte_Cursor 
FETCH NEXT FROM dte_Cursor INTO @date 

WHILE @@FETCH_STATUS = 0 
BEGIN 
insert #datetable 

SELECT 
     cast((select distinct Convert(Nvarchar(12),date,102) from Attendance where date = @date 
          and employeeid [email protected]) as nvarchar(30)) 
         date 

,CASE WHEN EXISTS (select 1 from Attendance 
         where [email protected] and date = @date) 
       then 'Present' 
       else 'absent' 
         end Status 

,dbo.GetWorkingHourPerDay(@date,@EmployeeID) as numberOFWorkingHour 
FETCH NEXT FROM dte_Cursor INTO @date 
END 

CLOSE dte_Cursor; 
DEALLOCATE dte_Cursor; 
end 

И часть кода функции, что получить Ошибка:

SET @From = (SELECT Time from @Tbl where date = @Date AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPIN') 

set @to = (CASE WHEN EXISTS(SELECT Times from @Tbl where dates = @Date AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPOUT') 
then (SELECT Time from @Tbl where date = @Date AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPOUT') 
else (SELECT Top 1 Time from @Tbl where date = dateadd(day,1,@Date) AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPOUT') 
end) 

return ROUND(CAST(DATEDIFF(@From,@to) AS decimal)/ 60,2) 

следующий фрагмент кода, который получает ошибку:

(CASE WHEN EXISTS(SELECT Times from @Tbl where dates = @Date AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPOUT') 

В данном примере работник имеют два из пуансонов, как ниже:

EMPID  Date   Time   Status 
123   2015-10-22  06:54:42 AM  OUT 
123   2015-10-22  04:35:02 PM  OUT 

Так как, как обращаться это состояние?

ответ

0

Вы можете просто изменить

(CASE WHEN EXISTS(SELECT Times from @Tbl where dates = @Date AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPOUT') 

Для этого

(CASE WHEN EXISTS(SELECT top 1 Times from @Tbl where dates = @Date AND ([email protected] OR ISNULL(@employeeID, '') = '') and funckey = 'EMPOUT') 
Смежные вопросы