背景
我在 SQL Server 2012 1的数据库中有一个存储过程,它获取一些值的平均值。此存储过程接收两 (2) 个 int 类型的值作为参数。
例子:
- 官方编号
- 进程 ID
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),被执行并保存在临时表中。
我遇到的错误是语法错误,我承认我不知道如何执行此功能。
我如何生成一个存储过程,该存储过程又调用另一个存储过程“在这种情况下,一个SP_PromedioReporte
”,如this question中所述?见测试查询代码:。
注意:对于这种情况,我正在寻找纯粹在 SQL Server 中的解决方案,因为按照逻辑,我可以首先查询“Officers”表并循环调用存储过程并“通过后端”处理所有内容,但是,在我参与的项目中,所有逻辑都旨在应用于存储过程。
无法直接从查询中调用存储过程,但您可以通过函数调用它,也就是说,它不是
SP_PromedioReporte
存储过程,而是一个函数,它是这样的:有了这个,您现在可以直接发送它以在您的查询中调用
dbo.FN_PromedioReporte(temp.IdFuncionario, temp.IdProceso)
:在这里你可以看到demostración
至少据我所知,解决它的唯一方法是通过游标,这并不理想,我们应该始终寻找更好的选择,但是嘿......它有效。您的示例将如下所示: