я хранимая процедура, в которой возвращает таблицу, содержащую 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
Так как, как обращаться это состояние?