如何解决标量函数返回内存不足错误
说明:我需要一个函数来比较 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 举报,一经查实,本站将立刻删除。