Maideen Abdul Kader Ответов: 3

Как решить подзапрос, возвращающий более 1 значения в strored процедуре?


Привет
У меня есть ошибка в хранимой процедуре MSSQL 2017

"
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or 
when the subquery is used as an expression.



когда я использую приведенный ниже код

Пожалуйста, посоветуйте мне

Спасибо

Мейден

Что я уже пробовал:

хранимая процедура

UPDATE [dbo].[AD_Staff_Attandance] SET TotHours = 
(SELECT [dbo].[GetTotalWorkingHours] (DateOut,DateIn) AS TIMEWORKED_OUT_IN 
FROM [dbo].[AD_Staff_Attandance] )


Функция
ALTER FUNCTION [dbo].[GetTotalWorkingHours]
(
    @DateFrom Datetime,
    @DateTo Datetime
)
RETURNS DECIMAL(18,2)
AS
BEGIN
 
DECLARE @TotalWorkDays INT, @TotalTimeDiff DECIMAL(18, 2)
 
SET @TotalWorkDays = DATEDIFF(DAY, @DateFrom, @DateTo)
				    -(DATEDIFF(WEEK, @DateFrom, @DateTo) * 2)
					   -CASE
                                    WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday'
                                    THEN 1
                                    ELSE 0
                                END+CASE
                                        WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday'
                                        THEN 1
                                        ELSE 0
                                    END;
SET @TotalTimeDiff =
(
    SELECT DATEDIFF(SECOND,
                   (
                       SELECT CONVERT(TIME, @DateFrom)
                   ),
                   (
                       SELECT CONVERT(TIME, @DateTo)
                   )) / 3600.0
);
 
RETURN  (SELECT(@TotalWorkDays * 24.00) + @TotalTimeDiff)
 
END

3 Ответов

Рейтинг:
2

Dylvh

Вы можете сделать следующее

SELECT TOP 1 * FROM MyTable


Теперь "выберите топ-1..." может работать, но это может быть неправильно. Джерри упомянул, что у вас нет предложения WHERE в ваших операторах SELECT и UPDATE, поэтому вам придется посмотреть на это, чтобы убедиться, что вы получите правильные результаты.


Рейтинг:
16

phil.o

Ты можешь попробовать:

UPDATE dbo.AD_Staff_Attandance
SET TotHours = dbo.GetTotalWorkingHours(DateOut, DateIn)
Как нет так и нет WHERE предложение, этот запрос обновит все строки в таблице; запрос будет длиться пропорционально количеству строк.


Рейтинг:
1

Gerry Schmitz

Вы должны подумать о том, почему у вас нет предложения WHERE в вашем SELECT и UPDATE; ваш SELECT, вероятно, возвращает "несколько записей".

Цитата:
Обновление [dbo].[AD_Staff_Attandance] SET TotHours =
(ВЫБИРАТЬ [dbo].[GetTotalWorkingHours] (DateOut,DateIn) как TIMEWORKED_OUT_IN
От [dbo].[AD_Staff_Attandance] )


Maideen Abdul Kader

Привет, спасибо за быстрый ответ.
Мне нужно обновить столбец ToHours для всех строк или записей.
Даже в предложении Where есть та же ошибка.
Пожалуйста, посоветуйте мне
Спасибо еще раз
Мейден