#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть функция, которая принимает два параметра, получает общее количество записей, получает общее значение поля «Значение записи», а затем возвращает вычисленное среднее значение. Таким же образом вы получаете любое «среднее» число… (Общее количество записей = среднее).
DECLARE @RecordCount INT = 0
DECLARE @RecordTotal INT = 0
DECLARE @RecordAverage DECIMAL(3,2) = 0.00
SET @RecordCount = (SELECT COUNT(*) FROM <query here>)
SET @RecordTotal = (SELECT SUM(RecordValue) FROM <query here>)
SET @RecordAverage = (CAST(@RecordCount AS DECIMAL(5,2))) / (CAST(@RecordTotal AS DECIMAL(5,2)))
Теперь, если я запускаю ФУНКЦИЮ СЦЕНАРИЯ КАК> ВЫБРАТЬ в SQL Server Management Studio, она выдает мне допустимое десятичное число, которое при запуске для первой записи, которую я ищу, возвращает 9,75.
Моя хранимая процедура вызывает эту функцию и передает ей два требуемых параметра, которые я использовал «вручную» при самостоятельном запуске функции:
SELECT dbo.MyFunctionThatReturnsAnAverage(RecordTypeId, RecordCategory) AS 'Returned Average'
FROM <query here>
Тем не менее, когда я запускаю это, я получаю следующую ошибку:
Arithmetic overflow error converting numeric to data type numeric. (line 53)
Строка 53 — это оператор SELECT. Все переменные объявлены правильно, и десятичные числа являются ДЕСЯТИЧНЫМИ (5,2). Кто-нибудь видит что-то неправильное в том, как я вычисляю это среднее значение, без необходимости публиковать выполняемый огромный запрос (множество объединений и еще много чего)?
Комментарии:
1. Какой тип данных
RecordValue
? ЧтоSCRIPT FUNCTION AS > SELECT TO
означает?2. Значение записи — это значение INT. Итак, внутри функции, допустим, было 2 записи, одна со значением записи 2, а другая со значением записи 7. (7 2) / 2 = 4.5. Поэтому, когда я присваиваю каждому из них значение ДЕСЯТИЧНОЙ ДРОБИ, оно должно возвращать 4,50 в качестве ответа. Это отлично работает, когда я запускаю функцию самостоятельно (вручную вводя в нее RecordTypeId и RecordCategory). Но когда я запускаю хранимую процедуру (которая вызывает функцию), я получаю эту ошибку.