微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

标量函数返回内存不足错误

如何解决标量函数返回内存不足错误

说明:我需要一个函数来比较 2 个值集(17 个单独的值),一个集被传递 到函数,另一个保存在数据库中,需要做一个转换,因为值是 varchar,并被转换为十进制(8,3),我对发送的值求和,并对上的值求和相同类型的数据库,所以我可以比较最后的总和并确定 发送的值比保存的值多或少,并返回一个文本,说明是什么 发生...

如果我注释掉最后一个 if,代码不会出错,但是 如果我用 tha last if 运行它,它会给出一个错误,说 sql 没有内存,它有4.5GB的内存,比较不是 大,只有 2 个不大于 100 的数字(sql server 上没有其他数字,也没有其他数字) 查询正在运行)

此外,我有一个函数可以返回查询管道之间的值...

谁能帮我解决这个问题?我不明白错误,它不应该占用太多内存 比较两个十进制值...

ALTER FUNCTION [dbo].[tarifa_enviada_vs_tarifa_almacenada]
(
@lugar_buscar as varchar(20),@identificador as varchar(12),@termo_enviado as varchar(15),@cruce_enviado as varchar(15),@colombia_enviado as varchar(15),@plataforma_colombia_enviado as varchar(15),@inspeccion_enviado as varchar(15),@enlonar_enviado as varchar(15),@vacio_enviado as varchar(15),@falso_enviado as varchar(15),@movimiento_enviado as varchar(15),@movimiento_pg_enviado as varchar(15),@recinto_enviado as varchar(15),@hub_enviado as varchar(15),@movimiento_nld_enviado as varchar(15),@movimiento_lrd_enviado as varchar(15),@rojo_3hrs_enviado as varchar(15),@amarillo_enviado as varchar(15),@multa_enviado as varchar(15)
)
RETURNS varchar(50) AS
BEGIN
declare @tarifa_original as varchar(max),@valor_campo as varchar(30),@total_enviado as decimal(8,3),@total_almacenado as decimal(8,3);
declare @termo_enviado_decimal as decimal(8,@cruce_enviado_decimal as decimal(8,@colombia_enviado_decimal as decimal(8,@plataforma_colombia_enviado_decimal as decimal(8,@inspeccion_enviado_decimal as decimal(8,@enlonar_enviado_decimal as decimal(8,@vacio_enviado_decimal as decimal(8,@falso_enviado_decimal as decimal(8,@movimiento_enviado_decimal as decimal(8,@movimiento_pg_enviado_decimal as decimal(8,@recinto_enviado_decimal as decimal(8,@hub_enviado_decimal as decimal(8,@movimiento_nld_enviado_decimal as decimal(8,@movimiento_lrd_enviado_decimal as decimal(8,@rojo_3hrs_enviado_decimal as decimal(8,@amarillo_enviado_decimal as decimal(8,@multa_enviado_decimal as decimal(8,@termo_almacenado_decimal as decimal(8,@cruce_almacenado_decimal as decimal(8,@colombia_almacenado_decimal as decimal(8,@plataforma_colombia_almacenado_decimal as decimal(8,@inspeccion_almacenado_decimal as decimal(8,@enlonar_almacenado_decimal as decimal(8,@vacio_almacenado_decimal as decimal(8,@falso_almacenado_decimal as decimal(8,@movimiento_almacenado_decimal as decimal(8,@movimiento_pg_almacenado_decimal as decimal(8,@recinto_almacenado_decimal as decimal(8,@hub_almacenado_decimal as decimal(8,@movimiento_nld_almacenado_decimal as decimal(8,@movimiento_lrd_almacenado_decimal as decimal(8,@rojo_3hrs_almacenado_decimal as decimal(8,@amarillo_almacenado_decimal as decimal(8,@multa_almacenado_decimal as decimal(8,3);
                if @lugar_buscar= '_CATAlogo_'
                                begin
                                 set @tarifa_original = (select convert(varchar,termo) + '|' +    convert(varchar,cruce) + '|' + convert(varchar,colombia)       + '|' + convert(varchar,plataforma_colombia) + '|' + convert(varchar,inspeccion) + '|' + convert(varchar,enlonar)  + '|' + convert(varchar,vacio) + '|' + convert(varchar,falso) + '|' + convert(varchar,movimiento)          + '|' + convert(varchar,movimiento_pg) + '|' + convert(varchar,recinto)  + '|' + convert(varchar,hub)   + '|' + convert(varchar,movimiento_nld) + '|' + convert(varchar,movimiento_lrd)      + '|' + convert(varchar,rojo_3hrs)     + '|' + convert(varchar,amarillo) + '|' + convert(varchar,multa) + '|'
from [STR].[dbo].[catalogo_convenios]                                                                                                                                               where identificador_convenio = @identificador);
                                end       
                else
                                begin
set @tarifa_original = (select convenio_original                                                                                                                                              from [STR].[dbo].[viajes_convenios]                                                                                                            where identificador_viaje = @identificador);
                                end
                -- si es nulo devuelvo en cero
                if (@tarifa_original is null or @tarifa_original='')
                                begin
                                  set @tarifa_original = '0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0';
                                end

                -- reviso lo enviado que tenga valor y luego convierto

                set @termo_enviado = iif((@termo_enviado is null or @termo_enviado = ''),'0.000',@termo_enviado);

                set @termo_enviado_decimal = cast(@termo_enviado as decimal(8,3));

                set @cruce_enviado = iif((@cruce_enviado is null or @cruce_enviado = ''),@cruce_enviado);

                set @cruce_enviado_decimal = cast(@cruce_enviado as decimal(8,3));

                set @colombia_enviado = iif((@colombia_enviado is null or @colombia_enviado = ''),@colombia_enviado);

                set @colombia_enviado_decimal = cast(@colombia_enviado as decimal(8,3));

                set @plataforma_colombia_enviado = iif((@plataforma_colombia_enviado is null or @plataforma_colombia_enviado = ''),@plataforma_colombia_enviado);

                set @plataforma_colombia_enviado_decimal = cast(@plataforma_colombia_enviado as decimal(8,3));

                set @inspeccion_enviado = iif((@inspeccion_enviado is null or @inspeccion_enviado = ''),@inspeccion_enviado);

                set @inspeccion_enviado_decimal = cast(@inspeccion_enviado as decimal(8,3));


                set @enlonar_enviado = iif((@enlonar_enviado is null or @enlonar_enviado = ''),@enlonar_enviado);

                set @enlonar_enviado_decimal = cast(@enlonar_enviado as decimal(8,3));

                set @vacio_enviado = iif((@vacio_enviado is null or @vacio_enviado = ''),@vacio_enviado);

                set @vacio_enviado_decimal = cast(@vacio_enviado as decimal(8,3));

                set @falso_enviado = iif((@falso_enviado is null or @falso_enviado = ''),@falso_enviado);

                set @falso_enviado_decimal = cast(@falso_enviado as decimal(8,3));

                set @movimiento_enviado = iif((@movimiento_enviado is null or @movimiento_enviado = ''),@movimiento_enviado);

                set @movimiento_enviado_decimal = cast(@movimiento_enviado as decimal(8,3));

                set @movimiento_pg_enviado = iif((@movimiento_pg_enviado is null or @movimiento_pg_enviado = ''),@movimiento_pg_enviado);

                set @movimiento_pg_enviado_decimal = cast(@movimiento_pg_enviado as decimal(8,3));

                set @recinto_enviado = iif((@recinto_enviado is null or @recinto_enviado = ''),@recinto_enviado);

                set @recinto_enviado_decimal = cast(@recinto_enviado as decimal(8,3));

                set @hub_enviado = iif((@hub_enviado is null or @hub_enviado = ''),@hub_enviado);

                set @hub_enviado_decimal = cast(@hub_enviado as decimal(8,3));

                set @movimiento_nld_enviado = iif((@movimiento_nld_enviado is null or @movimiento_nld_enviado = ''),@movimiento_nld_enviado);

                set @movimiento_nld_enviado_decimal = cast(@movimiento_nld_enviado as decimal(8,3));

                set @movimiento_lrd_enviado = iif((@movimiento_lrd_enviado is null or @movimiento_lrd_enviado = ''),@movimiento_lrd_enviado);

                set @movimiento_lrd_enviado_decimal = cast(@movimiento_lrd_enviado as decimal(8,3));

                set @rojo_3hrs_enviado = iif((@rojo_3hrs_enviado is null or @rojo_3hrs_enviado = ''),@rojo_3hrs_enviado);

                set @rojo_3hrs_enviado_decimal = cast(@rojo_3hrs_enviado as decimal(8,3));

                set @amarillo_enviado = iif((@amarillo_enviado is null or @amarillo_enviado = ''),@amarillo_enviado);

                set @amarillo_enviado_decimal = cast(@amarillo_enviado as decimal(8,3));

 

                set @multa_enviado = iif((@multa_enviado is null or @multa_enviado = ''),@multa_enviado);

                set @multa_enviado_decimal = cast(@multa_enviado as decimal(8,3));

                -- reviso lo guardado y luego convierto
                set @valor_campo = dbo.obten_campo_n(@tarifa_original,1,'|');

                set @valor_campo = iif((@valor_campo is null or @valor_campo = ''),@valor_campo);

                set @termo_almacenado_decimal = cast(@valor_campo as decimal(8,3));

 

                set @valor_campo = dbo.obten_campo_n(@tarifa_original,2,@valor_campo);

                set @cruce_almacenado_decimal = cast(@valor_campo as decimal(8,3));

 
                set @valor_campo = dbo.obten_campo_n(@tarifa_original,3,@valor_campo);

                set @colombia_almacenado_decimal = cast(@valor_campo as decimal(8,4,@valor_campo);

                set @plataforma_colombia_almacenado_decimal = cast(@valor_campo as decimal(8,5,@valor_campo);

                set @inspeccion_almacenado_decimal = cast(@valor_campo as decimal(8,6,@valor_campo);

                set @enlonar_almacenado_decimal = cast(@valor_campo as decimal(8,7,@valor_campo);

                set @vacio_almacenado_decimal = cast(@valor_campo as decimal(8,8,@valor_campo);

                set @falso_almacenado_decimal = cast(@valor_campo as decimal(8,9,@valor_campo);

                set @movimiento_almacenado_decimal = cast(@valor_campo as decimal(8,10,@valor_campo);

                set @movimiento_pg_almacenado_decimal = cast(@valor_campo as decimal(8,11,@valor_campo);

                set @recinto_almacenado_decimal = cast(@valor_campo as decimal(8,12,@valor_campo);

                set @hub_almacenado_decimal = cast(@valor_campo as decimal(8,13,@valor_campo);

                set @movimiento_nld_almacenado_decimal = cast(@valor_campo as decimal(8,14,@valor_campo);

                set @movimiento_lrd_almacenado_decimal = cast(@valor_campo as decimal(8,15,@valor_campo);

                set @rojo_3hrs_almacenado_decimal = cast(@valor_campo as decimal(8,16,@valor_campo);

                set @amarillo_almacenado_decimal = cast(@valor_campo as decimal(8,17,@valor_campo);

                set @multa_almacenado_decimal = cast(@valor_campo as decimal(8,3));

 

                                -- sumo las diferencias de enviados

                set @total_enviado = 0.000;

                set @total_almacenado = 0.000;

                if @termo_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @termo_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @termo_almacenado_decimal;

                                end

                if @cruce_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @cruce_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @cruce_almacenado_decimal;

                                end

                if @colombia_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @colombia_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @colombia_almacenado_decimal;

                                end

                if @plataforma_colombia_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @plataforma_colombia_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @plataforma_colombia_almacenado_decimal;

                                end

                if @inspeccion_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @inspeccion_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @inspeccion_almacenado_decimal;

                                end

                if @enlonar_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @enlonar_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @enlonar_almacenado_decimal;

                                end

                if @vacio_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @vacio_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @vacio_almacenado_decimal;

                                end

                if @falso_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @falso_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @falso_almacenado_decimal;

                                end

                if @movimiento_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @movimiento_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @movimiento_almacenado_decimal;

                                end

                if @movimiento_pg_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @movimiento_pg_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @movimiento_pg_almacenado_decimal;

                                end

                if @recinto_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @recinto_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @recinto_almacenado_decimal;

                                end

                if @hub_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @hub_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @hub_almacenado_decimal;

                                end

                if @movimiento_nld_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @movimiento_nld_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @movimiento_nld_almacenado_decimal;

                                end

                if @movimiento_lrd_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @movimiento_lrd_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @movimiento_lrd_almacenado_decimal;

                                end

                if @rojo_3hrs_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @rojo_3hrs_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @rojo_3hrs_almacenado_decimal;

                                end

                if @amarillo_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @amarillo_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @amarillo_almacenado_decimal;

                                end

                if @multa_enviado_decimal <> 0

                                begin

                                                set @total_enviado = @total_enviado + @multa_enviado_decimal;

                                                set @total_almacenado = @total_almacenado + @multa_almacenado_decimal;
                                end

                if @total_almacenado > @total_enviado
                  begin
                    return 'DESCUENTO';
                  end
                else if @total_almacenado < @total_enviado
                  begin
                    return 'AUMENTO';
                  end 
return 'NINGUNO';

END

/*
this is what i use to test the code:

declare @respuesta as varchar(80);
set @respuesta = (select dbo.tarifa_enviada_vs_tarifa_almacenada('_CATAlogo_','CON210000001','1.990','250.000','0.000') as resultado)
select @respuesta; print @respuesta

*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。