我正在尝试使用一个存储过程来处理当前放置在该位置的资产的每个位置= "Ubicacion“(计算固定资产的数量= Ubicacion,计算这些资产的价值金额,并计算这些资产折旧的金额)。问题是游标似乎只能提取一次
游标查询:
SELECT DISTINCT (ubicacion) FROM
(SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM [SISACT].ACTIVO_UBICACION) someAlias WHERE RowNum = 1结果:
Ubicacion
----------
1114
4450
4353它应该会被获取3次。“位置”中的每条记录一个,位置中只有最新的记录。
ALTER PROCEDURE [SISACT].[resume_activos]
AS
BEGIN
DECLARE @u CHAR(8);
DECLARE @p VARCHAR(8);
DECLARE @num_activos INT = 0;
DECLARE @monto_activos FLOAT = 0;
DECLARE @saldo_dep_activos FLOAT = 0;
DECLARE U CURSOR STATIC
FOR SELECT DISTINCT (ubicacion) FROM
(SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM [SISACT].ACTIVO_UBICACION) someAlias WHERE RowNum = 1
OPEN U
FETCH NEXT FROM U INTO @u
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @num_activos = COUNT(a.Activo), @monto_activos = SUM(a.Costo_adquisicion), @saldo_dep_activos = SUM(a.Saldo_a_depreciar) FROM [SISACT].ACTIVOS_FIJOS a, [SISACT].UBICACIONES ub, (SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM [SISACT].ACTIVO_UBICACION) ab WHERE RowNum = 1 AND ub.Ubicacion = @u AND a.Activo = ab.Activo AND ab.Ubicacion = @u
PRINT 'Ubicacion: ' +@u +' Num activos: ' + CONVERT(VARCHAR, @num_activos) + ' monto activos: ' + CONVERT(VARCHAR, @monto_activos) + ' saldo activos depreciados: '+ CONVERT(VARCHAR, @saldo_dep_activos)
FETCH NEXT FROM U INTO @u
END
CLOSE U
DEALLOCATE U
END"Print“语句只在"Message”选项卡中显示一次,第一个位置和我之前所说的计算结果,再加上它没有返回任何东西,我希望它返回如下内容
Ubicacion | Num_Act | Monto_Act | Saldo_dep_Act
------------------------------------------------
4453 | 2 | 5787.65 | 332.247我是T-SQL的新手,所以如果我做了一些非常愚蠢、非常错误的事情,请原谅我,我以前只做过一个带有游标的SP,它工作得很好(而且它没有返回任何东西)。
我做错了什么?
提前谢谢你。
发布于 2013-04-11 09:05:52
它实际上是正确地进行了计算。我更改了您的SP,以便在varchar(max)中累积输出,并且仅在末尾输出:
CREATE PROCEDURE [resume_activos]
AS
BEGIN
DECLARE @u VARCHAR(8);
DECLARE @p VARCHAR(8);
DECLARE @allOutput VARCHAR(MAX) = '';
DECLARE @num_activos INT = 0;
DECLARE @monto_activos FLOAT = 0;
DECLARE @saldo_dep_activos FLOAT = 0;
DECLARE U CURSOR STATIC
FOR SELECT DISTINCT (ubicacion) FROM
(SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM ACTIVO_UBICACION) someAlias WHERE RowNum = 1
OPEN U
FETCH NEXT FROM U INTO @u
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @num_activos = COUNT(a.Activo), @monto_activos = SUM(a.Costo_adquisicion), @saldo_dep_activos = SUM(a.Saldo_a_depreciar) FROM ACTIVOS_FIJOS a, UBICACIONES ub, (SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM ACTIVO_UBICACION) ab WHERE RowNum = 1 AND ub.Ubicacion = @u AND a.Activo = ab.Activo AND ab.Ubicacion = @u
SET @allOutput = @allOutput + char(10) + char(13) + 'Ubicacion: ' +@u +' Num activos: ' + CONVERT(VARCHAR, @num_activos) + ' monto activos: ' + CONVERT(VARCHAR, @monto_activos) + ' saldo activos depreciados: '+ CONVERT(VARCHAR, @saldo_dep_activos)
FETCH NEXT FROM U INTO @u
END
CLOSE U
DEALLOCATE U
SELECT @allOutput
END输出结果为:
Ubicacion: 1114 Num activos: 2 monto activos: 2781.15 saldo activos depreciados: 53.1104
Ubicacion: 4450 Num activos: 1 monto activos: 4553 saldo activos depreciados: 126.472
Ubicacion: 4453 Num activos: 2 monto activos: 5787.65 saldo activos depreciados: 332.247你可以在这里看到它的工作原理:http://sqlfiddle.com/#!3/bce40/1/0
如果您更喜欢将结果作为实际的表,只需创建一个临时表,并在每次迭代中插入部分结果。然后在最后,从中进行选择,以获得完整的结果集。
https://stackoverflow.com/questions/15937570
复制相似问题