Consulta de ejecucion de Procedimiento

11/12/2009 - 16:10 por Luis Mata | Informe spam
Hola

Una Consulta, hace tiempo que decidi hacer que todo lo que es consultas,
consolidados se hiciera con SP,
trabajo con vpn con 9 sedes remotas
Los procedimientos toman datos de dias, semanas, meses ó años lo cual si
tuviera que llevar de cada tienda los datos a la pc cliente y ahi recien
consolidarlos me saturaria el ancho de banda.
Hice un procedimiento que hace todo eso pero en el servidor y de lo que
deberia de transferir 300 mil registros, el procedimiento ya procesado me
transfiere 50 registros.
El procedimiento demora +- 3 ó 4 min en culminar el proceso.
El cliente solo lanza una linea de codigo invocando dicho procedimiento,
pero que sucede que durante ese tiempo el consumo de ancho de banda se eleva
considerablemente hasta el punto de hacer caer la conexion de las demas pcs,
luego de hacer todo este alboroto me muestra en el cliente los 50m registros
nada mas:

- que es lo que satura mi ancho de banda durante ese proceso si no hay data
que fluya entre una sede remota y la otra?
- Mi concepto de crear procedimientos para poder aprovechar al maximo el
ancho de banda esta errado?
- de todas manera una linea de codigo invocando un procedimiento de esa
magnitud deberia de saturarme mi ancho de banda?

Si el caso fuera asi cual es la gracia de hacer todo con procedimientos
almacenados.?

Att
Luis Mata

Preguntas similare

Leer las respuestas

#6 Aguardientico
17/12/2009 - 05:12 | Informe spam
Luis:

Supongo que utilizas linkedservers, si es asi, debes tomar en cuenta que
aunque sql server trata de ejecutar cada consulta en su respectivo servidor,
si está mal configurada la consulta lo que hace es cargar TODOS los datos en
el server local y de ahi procesar la consulta.

Te recomiendo que trates de filtrar las consultas para cada base de datos
para que desde el comienzo cada una de ellas te de los 50 registros (o los
que necesites) y luego de eso hagas join entre todas estas consultas para
unir la información.

"Luis Mata" wrote in message
news:
Hola

Una Consulta, hace tiempo que decidi hacer que todo lo que es consultas,
consolidados se hiciera con SP,
trabajo con vpn con 9 sedes remotas
Los procedimientos toman datos de dias, semanas, meses ó años lo cual si
tuviera que llevar de cada tienda los datos a la pc cliente y ahi recien
consolidarlos me saturaria el ancho de banda.
Hice un procedimiento que hace todo eso pero en el servidor y de lo que
deberia de transferir 300 mil registros, el procedimiento ya procesado me
transfiere 50 registros.
El procedimiento demora +- 3 ó 4 min en culminar el proceso.
El cliente solo lanza una linea de codigo invocando dicho procedimiento,
pero que sucede que durante ese tiempo el consumo de ancho de banda se
eleva considerablemente hasta el punto de hacer caer la conexion de las
demas pcs, luego de hacer todo este alboroto me muestra en el cliente los
50m registros nada mas:

- que es lo que satura mi ancho de banda durante ese proceso si no hay
data que fluya entre una sede remota y la otra?
- Mi concepto de crear procedimientos para poder aprovechar al maximo el
ancho de banda esta errado?
- de todas manera una linea de codigo invocando un procedimiento de esa
magnitud deberia de saturarme mi ancho de banda?

Si el caso fuera asi cual es la gracia de hacer todo con procedimientos
almacenados.?

Att
Luis Mata


__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4680 (20091211) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus signature database 4694 (20091216) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com
Respuesta Responder a este mensaje
#7 Luis Mata
17/12/2009 - 15:58 | Informe spam
Las consultas son directas al servidor.

- quizas las consultas ejecutadas con exec() sean lentas
- usar #tabla la haga lenta

pego el procedure que me consume ancho de banda

sp en sql 2008 sp1

ALTER proc [dbo].[meta_total_vendedor] @panio char(4), @pmes char(2)
as
declare @notc char(1)
set @notc = 'N'
SET LANGUAGE Spanish
declare @fechagen datetime,@fechatest datetime,@diastest int, @dias4m int
if cast(@panio as int)!=year(getdate()) or cast(@pmes as
int)!=month(getdate())
begin
set @fechatest = cast(@panio+'-01'+'-'+@pmes as datetime)
set @diastest = DAY(DATEADD(DAY, -1, CONVERT(VARCHAR(6), DATEADD(MONTH, 1,
@fechatest), 112) + '01'))
set @fechagen = cast(@panio+'-'+cast(@diastest as char(2))+'-'+@pmes as
datetime)
end
else
begin
set @fechagen = getdate()
end
declare @anio int,@mes int
set @anio = YEAR(@fechagen)
set @mes = MONTH(@fechagen)
declare @dinicial datetime, @numdias int, @diaactual int, @diareal
decimal(12,4)
declare @ejecuta varchar(7500), @vnomven varchar(20)
set @dinicial = @fechagen-(day(@fechagen)-1)
set @numdias = DAY(DATEADD(DAY, -1, CONVERT(VARCHAR(6), DATEADD(MONTH, 1,
@fechagen), 112) + '01'))
set @dias4m = @numdias -4
set @diaactual = day(@fechagen)
set @diareal = (cast(@diaactual as decimal(12,4))/cast(@numdias as
decimal(12,4)))*(cast(@numdias as decimal(12,4))-4)
create table #tabmmetas(ID int not null default 0,c1 varchar(90) not null
default space(0),c2 varchar(60)not null default space(0),c3
varchar(60),metatotal decimal(12,2) not null default 0)
set @ejecuta = 'insert into #tabmmetas values(1,'+''''+'Dia Actual (para
calc: '+cast(@diareal as nvarchar(15))+')'+''''+','+''''+cast(@diaactual as
varchar(2))+''''+','+''''+'Hoy'+''''+',0)'
print @ejecuta
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(2,'+''''+'Cuota del
Mes'+''''+','+''''+''+''''+','+''''+''+''''+',0)'--CAMBIO
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(3,'+''''+'Cuota
Diaria'+''''+','+''''+ltrim(str(@dias4m))+''''+','+''''+'Dias'+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(4,'+''''+'Acumulado al Dia de
HOY'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(5,'+''''+'Como deberia Ir
S/.'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(6,'+''''+'Acumulado a la Fecha
En %'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(7,'+''''+'Como deberia Ir En
%'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas
values(8,'+''''+'Diferencia'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(9,'+''''+'Acum. vs Como
deberia ir En %'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
declare @contar int,@metames decimal(12,2),@metatienda decimal(12,2)
declare @namebd varchar(5),@metaahora decimal(12,2)
set @namebd = (SELECT DB_NAME() AS [Current Database])
set @ejecuta = 'declare sacameta cursor for select '+@namebd+' from
maestro.dbo.tabtmetas where anio='+@panio+' and mes='+@pmes
exec (@ejecuta)
open sacameta
fetch next from sacameta into @metames
set @metatienda = @metames
deallocate sacameta
set @metaahora = @metames/(@numdias-4)
and mes = @mes)
set @ejecuta = 'update #tabmmetas set metatotal='+cast(@metames as
nvarchar)+' where id = 2'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set metatotal='+cast(@metames/@dias4m as
nvarchar)+' where id = 3'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
metatotal='+cast((@metames/@dias4m)*@diareal as nvarchar)+' where id =
5'@numdias-4
exec (@ejecuta)
if @metames!=0
begin
set @ejecuta = 'update #tabmmetas set
metatotal='+cast((((@metaahora*@diareal)/@metames)*100) as nvarchar)+' where
id = 7'
end
exec (@ejecuta)
set @contar = 0
declare curbd cursor for SELECT VENDEDOR FROM ARCHTRA1 WHERE
year(fecha)=@anio and month(fecha)=@mes and tot_sol!=0 group by vendedor
union
SELECT VENDEDOR FROM devolu WHERE year(fecha)=@anio and
month(fecha)=@mes and tot_sol!=0 group by vendedor
UNION
SELECT VENDEDOR FROM NOTA_DEB WHERE year(fecha)=@anio and
month(fecha)=@mes and tot_sol!=0 group by vendedor ORDER BY VENDEDOR
open curbd
fetch next from curbd into @vnomven
while @@fetch_status = 0
begin
set @ejecuta = 'alter table #tabmmetas add '+LOWER(rtrim(@vnomven))+'
decimal(12,2) default 0 not null'
exec (@ejecuta)
set @metames = (select meta from tabmetavend where anio=@anio and mes =
@mes and vendedor=rtrim(@vnomven))
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast(@metames as nvarchar)+' where id = 2'
exec (@ejecuta)
if @metames != 0
begin
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast(@metames/@dias4m as nvarchar)+' where id =
3'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast((@metames/(@dias4m))*(@diareal) as
nvarchar)+' where id = 5'
exec (@ejecuta)
if @metames!=0
begin
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast((((@metames/@dias4m)*@diareal)/@metames)*100
as nvarchar)+' where id = 7'
exec (@ejecuta)
end
end
fetch next from curbd into @vnomven
end
-cambio a spanish
declare @vtatotal decimal(12,2),@nctotal decimal(12,2),@ndtotal
decimal(12,2),@totfinal decimal(12,2),@varmeta decimal(12,2), @varacumula
decimal(12,2)
DECLARE @valor int
close curbd
set @valor = 0
while @valor <= (@numdias)-1
begin
set @ejecuta = 'insert into #tabmmetas(id,c2,c3)
values('+''''+cast(@valor+10 as varchar(2))+''''+','+''''+datename(weekday,
dateadd(d,@valor,@dinicial))+''''+','+''''+convert(char(6),dateadd(d,@valor,@dinicial),113)
+''''+')'
set @valor = @valor + 1
EXEC (@ejecuta)
open curbd
fetch next from curbd into @vnomven
while @@fetch_status = 0
begin
declare @unisol decimal(12,4), @bsol decimal(12,2), @dsol decimal(12,4),
@neto decimal(15,6), @igv decimal(12,2), @bruto decimal(12,2),
@total decimal(12,5), @ntotal decimal(12,5)
set @total = 0
set @ntotal = 0
set @ejecuta = 'declare miventa cursor for select codarticul, precioprod,
cantidad, descuento,proveedor from archtra3 where year(fecha)='+cast(@anio
as char(4))+' and month(fecha)='+cast(@mes as char(2))+
' and day(fecha)='+cast(@valor as varchar(2))+' and
vendedor='+''''+rtrim(@vnomven)+''''+
' union all
select codarticul, precioprod * -1, cantidad, descuento,proveedor from
devo_pro where year(fecha)='+cast(@anio as char(4))+' and
month(fecha)='+cast(@mes as char(2))+
' and day(fecha)='+cast(@valor as varchar(2))+' and
vendedor='+''''+rtrim(@vnomven)+''''+
' union all
select codarticul, precioprod, cantidad, descuento,proveedor from
notapro where year(fecha)='+cast(@anio as char(4))+' and
month(fecha)='+cast(@mes as char(2))+
' and day(fecha)='+cast(@valor as varchar(2))+' and
vendedor='+''''+rtrim(@vnomven)+''''+' order by codarticul'
print @ejecuta
exec (@ejecuta)
declare @codigo varchar(13), @precio decimal(12,4), @cant decimal(12,4),
@dscto decimal(12,2),@prov char(6),@excluye int,@nosuma int
open miventa
fetch next from miventa into @codigo,@precio, @cant, @dscto,@prov
while @@fetch_status = 0
begin
if @prov = 'ZZZ002' OR @prov = 'SUM001' OR @prov = 'ZZZ004' OR @prov =
'ZZ003'
BEGIN
set @excluye = (select count(*) from maestro.dbo.taberrnocont where
codigo=@codigo)
if @excluye =0
begin
set @unisol = @precio --round(sqlworkdbf.precioprod *
IIF(TTOD(sqlworkdbf.fecha)<fcsoles,sqlworkdbf.t_cambio,1),IIF(FECHA<vc4fec,2,4))&&&IIF(TTOD(archtra1.fecha)<fcsoles,sqlworkdbf.t_cambio,1)
set @bsol = round(@unisol * (case @cant when 0 then 1 else @cant
end),2)
set @dsol = round(@bsol * (@dscto/100),4)
set @neto = @bsol - @dsol
set @igv = round(@neto * 0.19,2)
set @bruto = round(@neto + @igv,2)
set @ntotal = @ntotal + round(@bruto / 1.19,2)
end
END
set @unisol = @precio --round(sqlworkdbf.precioprod *
IIF(TTOD(sqlworkdbf.fecha)<fcsoles,sqlworkdbf.t_cambio,1),IIF(FECHA<vc4fec,2,4))&&&IIF(TTOD(archtra1.fecha)<fcsoles,sqlworkdbf.t_cambio,1)
set @bsol = round(@unisol * (case @cant when 0 then 1 else @cant end),2)
set @dsol = round(@bsol * (@dscto/100),4)
set @neto = @bsol - @dsol
set @igv = round(@neto * 0.19,2)
set @bruto = round(@neto + @igv,2)
set @total = @total + round(@bruto / 1.19,2)
fetch next from miventa into @codigo,@precio, @cant, @dscto,@prov
end
deallocate miventa
PRINT rtrim(@vnomven) + cast(@total as nvarchar)+' '+ cast(@ntotal as
nvarchar)
set @totfinal = @@vtatotal+@nctotal+@ndtotal

set @ejecuta = 'update #tabmmetas set '+@vnomven+'='+cast(@totfinal as
nvarchar)+' where id='+''''+cast(@valor+9 as varchar(2))+''''
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set metatotal=metatotal+'+cast(@totfinal
as nvarchar)+' where id='+''''+cast(@valor+9 as varchar(2))+''''
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set metatotal=metatotal+'+cast(@totfinal
as nvarchar)+' where id=4'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
'+@vnomven+'='+@vnomven+'+'+cast(@totfinal as nvarchar)+' where id=4'
exec (@ejecuta)
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varmeta!=!=0 and
begin
set @ejecuta = 'update #tabmmetas set metatotal=('+cast(@varacumula as
nvarchar)+'/'+cast(@varmeta as nvarchar)+')*100 where id=6'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varacumula as
nvarchar)+'/'+cast(@varmeta as nvarchar)+')*100 where id=6'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
set @ejecuta = 'update #tabmmetas set metatotal=('+cast(@varmeta as
nvarchar)+'-'+cast(@varacumula as nvarchar)+') where id=8'
exec (@ejecuta)
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varmeta as
nvarchar)+'-'+cast(@varacumula as nvarchar)+') where id=8'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set metatotal=('+cast(@varmeta as
nvarchar)+'/'+cast(@varacumula as nvarchar)+')*100 where id=9'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varmeta as
nvarchar)+'/'+cast(@varacumula as nvarchar)+')*100 where id=9'
exec (@ejecuta)
end
fetch next from curbd into @vnomven
end
close curbd
end
deallocate curbd
-Calculos finales
set @ejecuta = 'select * from #tabmmetas order by id'
exec (@ejecuta)
set @ejecuta = 'drop table #tabmmetas'
exec (@ejecuta)


y lo llamos desde el cliente:
vano 09
vmes = 12
=SQLEXEC(cscom, "exec maestro.dbo.meta_total ?vano,?vmes","sqltabla")

Como ven el cliente solo lanza estas 3 lineas de codigo, en mi teoria esto
me ayudaria a ahorrar el ancho de banda de mi VPN pero no es asi en la
practica.

¿Que Pasa?

Luis


"Aguardientico" <gusgon1 at nospam dot com> escribió en el mensaje de
noticias news:
Luis:

Supongo que utilizas linkedservers, si es asi, debes tomar en cuenta que
aunque sql server trata de ejecutar cada consulta en su respectivo
servidor, si está mal configurada la consulta lo que hace es cargar TODOS
los datos en el server local y de ahi procesar la consulta.

Te recomiendo que trates de filtrar las consultas para cada base de datos
para que desde el comienzo cada una de ellas te de los 50 registros (o los
que necesites) y luego de eso hagas join entre todas estas consultas para
unir la información.

"Luis Mata" wrote in message
news:
Hola

Una Consulta, hace tiempo que decidi hacer que todo lo que es consultas,
consolidados se hiciera con SP,
trabajo con vpn con 9 sedes remotas
Los procedimientos toman datos de dias, semanas, meses ó años lo cual si
tuviera que llevar de cada tienda los datos a la pc cliente y ahi recien
consolidarlos me saturaria el ancho de banda.
Hice un procedimiento que hace todo eso pero en el servidor y de lo que
deberia de transferir 300 mil registros, el procedimiento ya procesado me
transfiere 50 registros.
El procedimiento demora +- 3 ó 4 min en culminar el proceso.
El cliente solo lanza una linea de codigo invocando dicho procedimiento,
pero que sucede que durante ese tiempo el consumo de ancho de banda se
eleva considerablemente hasta el punto de hacer caer la conexion de las
demas pcs, luego de hacer todo este alboroto me muestra en el cliente los
50m registros nada mas:

- que es lo que satura mi ancho de banda durante ese proceso si no hay
data que fluya entre una sede remota y la otra?
- Mi concepto de crear procedimientos para poder aprovechar al maximo el
ancho de banda esta errado?
- de todas manera una linea de codigo invocando un procedimiento de esa
magnitud deberia de saturarme mi ancho de banda?

Si el caso fuera asi cual es la gracia de hacer todo con procedimientos
almacenados.?

Att
Luis Mata


__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4680 (20091211) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4694 (20091216) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com



Respuesta Responder a este mensaje
#8 Aguardientico
18/12/2009 - 06:03 | Informe spam
Hola Luis:

Al hacer el sp en la forma que lo esas haciendo (valga la redundancia),
estas aplicando muchas malas practicas.

No utilices codigo sql dinamico, por ejemplo en vez de poner set @ejecuta
'sentencia sql'; exec @ejecuta;
Pon simplemente sentencia sql. Asi sql server puede saber si la sentencia
tiene que hacerla remota o no.

Algunos de tus cursores no tienen sentido (o al menos así parece) puedes
sacar los datos que necesitas directamente del select.

En la forma que tienes configurado el select, haces que Sql Server mande
todos los datos a tu cliente y trate de hacer el procesamiento desde el
cliente y es por eso el gran consumo de ancho de banda que tienes.

Atte.
Gustavo

"Luis Mata" wrote in message
news:
Las consultas son directas al servidor.

- quizas las consultas ejecutadas con exec() sean lentas
- usar #tabla la haga lenta

pego el procedure que me consume ancho de banda

sp en sql 2008 sp1

ALTER proc [dbo].[meta_total_vendedor] @panio char(4), @pmes char(2)
as
declare @notc char(1)
set @notc = 'N'
SET LANGUAGE Spanish
declare @fechagen datetime,@fechatest datetime,@diastest int, @dias4m int
if cast(@panio as int)!=year(getdate()) or cast(@pmes as
int)!=month(getdate())
begin
set @fechatest = cast(@panio+'-01'+'-'+@pmes as datetime)
set @diastest = DAY(DATEADD(DAY, -1, CONVERT(VARCHAR(6), DATEADD(MONTH, 1,
@fechatest), 112) + '01'))
set @fechagen = cast(@panio+'-'+cast(@diastest as char(2))+'-'+@pmes as
datetime)
end
else
begin
set @fechagen = getdate()
end
declare @anio int,@mes int
set @anio = YEAR(@fechagen)
set @mes = MONTH(@fechagen)
declare @dinicial datetime, @numdias int, @diaactual int, @diareal
decimal(12,4)
declare @ejecuta varchar(7500), @vnomven varchar(20)
set @dinicial = @fechagen-(day(@fechagen)-1)
set @numdias = DAY(DATEADD(DAY, -1, CONVERT(VARCHAR(6), DATEADD(MONTH, 1,
@fechagen), 112) + '01'))
set @dias4m = @numdias -4
set @diaactual = day(@fechagen)
set @diareal = (cast(@diaactual as decimal(12,4))/cast(@numdias as
decimal(12,4)))*(cast(@numdias as decimal(12,4))-4)
create table #tabmmetas(ID int not null default 0,c1 varchar(90) not null
default space(0),c2 varchar(60)not null default space(0),c3
varchar(60),metatotal decimal(12,2) not null default 0)
set @ejecuta = 'insert into #tabmmetas values(1,'+''''+'Dia Actual (para
calc: '+cast(@diareal as nvarchar(15))+')'+''''+','+''''+cast(@diaactual
as varchar(2))+''''+','+''''+'Hoy'+''''+',0)'
print @ejecuta
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(2,'+''''+'Cuota del
Mes'+''''+','+''''+''+''''+','+''''+''+''''+',0)'--CAMBIO
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(3,'+''''+'Cuota
Diaria'+''''+','+''''+ltrim(str(@dias4m))+''''+','+''''+'Dias'+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(4,'+''''+'Acumulado al Dia
de HOY'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(5,'+''''+'Como deberia Ir
S/.'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(6,'+''''+'Acumulado a la
Fecha En %'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(7,'+''''+'Como deberia Ir En
%'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas
values(8,'+''''+'Diferencia'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
set @ejecuta = 'insert into #tabmmetas values(9,'+''''+'Acum. vs Como
deberia ir En %'+''''+','+''''+''+''''+','+''''+''+''''+',0)'
EXEC (@ejecuta)
declare @contar int,@metames decimal(12,2),@metatienda decimal(12,2)
declare @namebd varchar(5),@metaahora decimal(12,2)
set @namebd = (SELECT DB_NAME() AS [Current Database])
set @ejecuta = 'declare sacameta cursor for select '+@namebd+' from
maestro.dbo.tabtmetas where anio='+@panio+' and mes='+@pmes
exec (@ejecuta)
open sacameta
fetch next from sacameta into @metames
set @metatienda = @metames
deallocate sacameta
set @metaahora = @metames/(@numdias-4)
and mes = @mes)
set @ejecuta = 'update #tabmmetas set metatotal='+cast(@metames as
nvarchar)+' where id = 2'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set metatotal='+cast(@metames/@dias4m as
nvarchar)+' where id = 3'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
metatotal='+cast((@metames/@dias4m)*@diareal as nvarchar)+' where id =
5'@numdias-4
exec (@ejecuta)
if @metames!=0
begin
set @ejecuta = 'update #tabmmetas set
metatotal='+cast((((@metaahora*@diareal)/@metames)*100) as nvarchar)+'
where id = 7'
end
exec (@ejecuta)
set @contar = 0
declare curbd cursor for SELECT VENDEDOR FROM ARCHTRA1 WHERE
year(fecha)=@anio and month(fecha)=@mes and tot_sol!=0 group by vendedor
union
SELECT VENDEDOR FROM devolu WHERE year(fecha)=@anio and
month(fecha)=@mes and tot_sol!=0 group by vendedor
UNION
SELECT VENDEDOR FROM NOTA_DEB WHERE year(fecha)=@anio and
month(fecha)=@mes and tot_sol!=0 group by vendedor ORDER BY VENDEDOR
open curbd
fetch next from curbd into @vnomven
while @@fetch_status = 0
begin
set @ejecuta = 'alter table #tabmmetas add '+LOWER(rtrim(@vnomven))+'
decimal(12,2) default 0 not null'
exec (@ejecuta)
set @metames = (select meta from tabmetavend where anio=@anio and mes =
@mes and vendedor=rtrim(@vnomven))
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast(@metames as nvarchar)+' where id = 2'
exec (@ejecuta)
if @metames != 0
begin
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast(@metames/@dias4m as nvarchar)+' where id
= 3'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast((@metames/(@dias4m))*(@diareal) as
nvarchar)+' where id = 5'
exec (@ejecuta)
if @metames!=0
begin
set @ejecuta = 'update #tabmmetas set
'+lower(rtrim(@vnomven))+'='+cast((((@metames/@dias4m)*@diareal)/@metames)*100
as nvarchar)+' where id = 7'
exec (@ejecuta)
end
end
fetch next from curbd into @vnomven
end
-cambio a spanish
declare @vtatotal decimal(12,2),@nctotal decimal(12,2),@ndtotal
decimal(12,2),@totfinal decimal(12,2),@varmeta decimal(12,2), @varacumula
decimal(12,2)
DECLARE @valor int
close curbd
set @valor = 0
while @valor <= (@numdias)-1
begin
set @ejecuta = 'insert into #tabmmetas(id,c2,c3)
values('+''''+cast(@valor+10 as
varchar(2))+''''+','+''''+datename(weekday,
dateadd(d,@valor,@dinicial))+''''+','+''''+convert(char(6),dateadd(d,@valor,@dinicial),113)
+''''+')'
set @valor = @valor + 1
EXEC (@ejecuta)
open curbd
fetch next from curbd into @vnomven
while @@fetch_status = 0
begin
declare @unisol decimal(12,4), @bsol decimal(12,2), @dsol decimal(12,4),
@neto decimal(15,6), @igv decimal(12,2), @bruto decimal(12,2),
@total decimal(12,5), @ntotal decimal(12,5)
set @total = 0
set @ntotal = 0
set @ejecuta = 'declare miventa cursor for select codarticul, precioprod,
cantidad, descuento,proveedor from archtra3 where year(fecha)='+cast(@anio
as char(4))+' and month(fecha)='+cast(@mes as char(2))+
' and day(fecha)='+cast(@valor as varchar(2))+' and
vendedor='+''''+rtrim(@vnomven)+''''+
' union all
select codarticul, precioprod * -1, cantidad, descuento,proveedor
from devo_pro where year(fecha)='+cast(@anio as char(4))+' and
month(fecha)='+cast(@mes as char(2))+
' and day(fecha)='+cast(@valor as varchar(2))+' and
vendedor='+''''+rtrim(@vnomven)+''''+
' union all
select codarticul, precioprod, cantidad, descuento,proveedor from
notapro where year(fecha)='+cast(@anio as char(4))+' and
month(fecha)='+cast(@mes as char(2))+
' and day(fecha)='+cast(@valor as varchar(2))+' and
vendedor='+''''+rtrim(@vnomven)+''''+' order by codarticul'
print @ejecuta
exec (@ejecuta)
declare @codigo varchar(13), @precio decimal(12,4), @cant decimal(12,4),
@dscto decimal(12,2),@prov char(6),@excluye int,@nosuma int
open miventa
fetch next from miventa into @codigo,@precio, @cant, @dscto,@prov
while @@fetch_status = 0
begin
if @prov = 'ZZZ002' OR @prov = 'SUM001' OR @prov = 'ZZZ004' OR @prov =
'ZZ003'
BEGIN
set @excluye = (select count(*) from maestro.dbo.taberrnocont where
codigo=@codigo)
if @excluye =0
begin
set @unisol = @precio --round(sqlworkdbf.precioprod *
IIF(TTOD(sqlworkdbf.fecha)<fcsoles,sqlworkdbf.t_cambio,1),IIF(FECHA<vc4fec,2,4))&&&IIF(TTOD(archtra1.fecha)<fcsoles,sqlworkdbf.t_cambio,1)
set @bsol = round(@unisol * (case @cant when 0 then 1 else @cant
end),2)
set @dsol = round(@bsol * (@dscto/100),4)
set @neto = @bsol - @dsol
set @igv = round(@neto * 0.19,2)
set @bruto = round(@neto + @igv,2)
set @ntotal = @ntotal + round(@bruto / 1.19,2)
end
END
set @unisol = @precio --round(sqlworkdbf.precioprod *
IIF(TTOD(sqlworkdbf.fecha)<fcsoles,sqlworkdbf.t_cambio,1),IIF(FECHA<vc4fec,2,4))&&&IIF(TTOD(archtra1.fecha)<fcsoles,sqlworkdbf.t_cambio,1)
set @bsol = round(@unisol * (case @cant when 0 then 1 else @cant end),2)
set @dsol = round(@bsol * (@dscto/100),4)
set @neto = @bsol - @dsol
set @igv = round(@neto * 0.19,2)
set @bruto = round(@neto + @igv,2)
set @total = @total + round(@bruto / 1.19,2)
fetch next from miventa into @codigo,@precio, @cant, @dscto,@prov
end
deallocate miventa
PRINT rtrim(@vnomven) + cast(@total as nvarchar)+' '+ cast(@ntotal as
nvarchar)
set @totfinal = @@vtatotal+@nctotal+@ndtotal

set @ejecuta = 'update #tabmmetas set '+@vnomven+'='+cast(@totfinal as
nvarchar)+' where id='+''''+cast(@valor+9 as varchar(2))+''''
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
metatotal=metatotal+'+cast(@totfinal as nvarchar)+' where
id='+''''+cast(@valor+9 as varchar(2))+''''
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
metatotal=metatotal+'+cast(@totfinal as nvarchar)+' where id=4'
exec (@ejecuta)
set @ejecuta = 'update #tabmmetas set
'+@vnomven+'='+@vnomven+'+'+cast(@totfinal as nvarchar)+' where id=4'
exec (@ejecuta)
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varmeta!=!=0 and
begin
set @ejecuta = 'update #tabmmetas set metatotal=('+cast(@varacumula as
nvarchar)+'/'+cast(@varmeta as nvarchar)+')*100 where id=6'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varacumula as
nvarchar)+'/'+cast(@varmeta as nvarchar)+')*100 where id=6'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=2'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
set @ejecuta = 'update #tabmmetas set metatotal=('+cast(@varmeta as
nvarchar)+'-'+cast(@varacumula as nvarchar)+') where id=8'
exec (@ejecuta)
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varmeta as
nvarchar)+'-'+cast(@varacumula as nvarchar)+') where id=8'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select metatotal from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0 and @varmeta!=0
begin
set @ejecuta = 'update #tabmmetas set metatotal=('+cast(@varmeta as
nvarchar)+'/'+cast(@varacumula as nvarchar)+')*100 where id=9'
exec (@ejecuta)
end
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=4'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varmeta
deallocate tabmeta
set @ejecuta = 'declare tabmeta cursor for select '+@vnomven+' from
#tabmmetas where id=5'
exec(@ejecuta)
open tabmeta
fetch next from tabmeta into @varacumula
deallocate tabmeta
if @varacumula!=0
begin
set @ejecuta = 'update #tabmmetas set '+@vnomven+'=('+cast(@varmeta as
nvarchar)+'/'+cast(@varacumula as nvarchar)+')*100 where id=9'
exec (@ejecuta)
end
fetch next from curbd into @vnomven
end
close curbd
end
deallocate curbd
-Calculos finales
set @ejecuta = 'select * from #tabmmetas order by id'
exec (@ejecuta)
set @ejecuta = 'drop table #tabmmetas'
exec (@ejecuta)


y lo llamos desde el cliente:
vano 09
vmes = 12
=SQLEXEC(cscom, "exec maestro.dbo.meta_total ?vano,?vmes","sqltabla")

Como ven el cliente solo lanza estas 3 lineas de codigo, en mi teoria esto
me ayudaria a ahorrar el ancho de banda de mi VPN pero no es asi en la
practica.

¿Que Pasa?

Luis


"Aguardientico" <gusgon1 at nospam dot com> escribió en el mensaje de
noticias news:
Luis:

Supongo que utilizas linkedservers, si es asi, debes tomar en cuenta que
aunque sql server trata de ejecutar cada consulta en su respectivo
servidor, si está mal configurada la consulta lo que hace es cargar TODOS
los datos en el server local y de ahi procesar la consulta.

Te recomiendo que trates de filtrar las consultas para cada base de datos
para que desde el comienzo cada una de ellas te de los 50 registros (o
los que necesites) y luego de eso hagas join entre todas estas consultas
para unir la información.

"Luis Mata" wrote in message
news:
Hola

Una Consulta, hace tiempo que decidi hacer que todo lo que es consultas,
consolidados se hiciera con SP,
trabajo con vpn con 9 sedes remotas
Los procedimientos toman datos de dias, semanas, meses ó años lo cual si
tuviera que llevar de cada tienda los datos a la pc cliente y ahi recien
consolidarlos me saturaria el ancho de banda.
Hice un procedimiento que hace todo eso pero en el servidor y de lo que
deberia de transferir 300 mil registros, el procedimiento ya procesado
me transfiere 50 registros.
El procedimiento demora +- 3 ó 4 min en culminar el proceso.
El cliente solo lanza una linea de codigo invocando dicho procedimiento,
pero que sucede que durante ese tiempo el consumo de ancho de banda se
eleva considerablemente hasta el punto de hacer caer la conexion de las
demas pcs, luego de hacer todo este alboroto me muestra en el cliente
los 50m registros nada mas:

- que es lo que satura mi ancho de banda durante ese proceso si no hay
data que fluya entre una sede remota y la otra?
- Mi concepto de crear procedimientos para poder aprovechar al maximo el
ancho de banda esta errado?
- de todas manera una linea de codigo invocando un procedimiento de esa
magnitud deberia de saturarme mi ancho de banda?

Si el caso fuera asi cual es la gracia de hacer todo con procedimientos
almacenados.?

Att
Luis Mata


__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4680 (20091211) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4694 (20091216) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com







__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4697 (20091217) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus signature database 4697 (20091217) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida