фон
У меня есть хранимая процедура в базе данных в SQL Server 2012 1 , которая получает среднее значение некоторых значений. Эта хранимая процедура получает в качестве параметров два (2) значения типа int.
Пример:
- Официальный идентификатор
- идентификатор процесса
1 Это та же версия менеджера баз данных, что и у меня на компьютере для разработки, но возможно, что эта база данных установлена в другой версии.
Проблема
Поскольку хранимая процедура также должна позволять получить среднее значение всех официальных лиц, я хотел бы создать новую процедуру для ее выполнения следующим образом:
Код тестового запроса:
-- Crear tabla temporal. Código adaptado de
-- https://stackoverflow.com/a/654418/4092887
CREATE TABLE #tmpBus
(
IDFUNCIONARIO NUMERIC (12, 0),
NOMBRE VARCHAR(100),
CAL_1 FLOAT,
CAL_2 FLOAT
);
-- Usando CTE "Common Table Expressions", recorrer la tabla "Funcionarios"
-- e invocar el procedimiento almacenado para ir guardando los resultados
-- en la tabla temporal "#tmpBus".
WITH CTE_func
AS
(
SELECT FUNC.IdFuncionario, FUNC.Nombre, 1 AS IdProceso
FROM Funcionario AS FUNC
)
SELECT temp.Nombre, EXEC SP_PromedioReporte temp.IdFuncionario, temp.IdProceso
FROM CTE_func AS temp
-- Retornar los valores almacenados en la tabla temporal.
SELECT *
FROM #tmpBus
Где SP_PromedioReporte
кастелянная процедура, вычисляющая среднее значение по сотруднику и указанному процессу; возвращая два столбца:
---------------------------
| Promedio 1 | Promedio 2 |
---------------------------
Результаты, которые я ожидаю получить, аналогичны этой таблице:
---------------------------------------
| Nombre | Promedio 1 | Promedio 2 |
---------------------------------------
|Alfonso | 10 | 85 |
---------------------------------------
|María | 12 | 38 |
---------------------------------------
|Jaime | 16 | 63 |
---------------------------------------
|Rodrigo | 20 | 69 |
---------------------------------------
|Laura | 18 | 49 |
---------------------------------------
Просматривая другие вопросы и ответы на Stack Overflow, я нашел этот ответ , где в основном создается временная таблица для хранения результатов хранимой процедуры, но я не могу настроить запрос так, чтобы при повторении всех офицеров (офицеров table) выполняется и сохраняется во временной таблице.
Ошибки, которые у меня есть, являются синтаксическими ошибками, и я признаю, что понятия не имею, как я могу реализовать эту функциональность.
Как я могу создать хранимую процедуру, которая, в свою очередь, вызывает другую хранимую процедуру «в данном случае a SP_PromedioReporte
», как объясняется в этом вопросе? см . код тестового запроса: .
ПРИМЕЧАНИЕ. Для этого случая я ищу решение исключительно в SQL Server, так как по логике я мог бы сначала запросить таблицу «Офицеры» и сделать цикл для вызова хранимой процедуры и обработки всего «бэк-эндом», без Однако в проекте, в котором я участвую, вся логика предназначена для применения в хранимых процедурах.
Невозможно вызвать хранимую процедуру непосредственно из запроса, но вы можете вызвать ее через функцию, то есть
SP_PromedioReporte
это не хранимая процедура, а функция, для которой это будет примерно так:При этом теперь вы можете отправить его для вызова в вашем запросе напрямую с помощью
dbo.FN_PromedioReporte(temp.IdFuncionario, temp.IdProceso)
:Здесь вы можете увидетьdemostración
По крайней мере, насколько мне известно, единственный способ решить эту проблему — с помощью курсора, это не идеально, и мы всегда должны искать лучшие альтернативы, но, эй... это работает. Ваш пример будет выглядеть примерно так: