Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Select de N registros en Procedimiento Almacenado

Estas en el tema de Select de N registros en Procedimiento Almacenado en el foro de SQL Server en Foros del Web. Holas!!! necesito ayuda de nuevo con esto de sql server... la pregunta es simple (creo) .... En un SP que se ejecuta cada cierto tiempo ...
  #1 (permalink)  
Antiguo 23/07/2007, 09:19
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Pregunta Select de N registros en Procedimiento Almacenado

Holas!!! necesito ayuda de nuevo con esto de sql server...

la pregunta es simple (creo) ....

En un SP que se ejecuta cada cierto tiempo (1 min para ser exactos)....
necesito que haga un select a una tabla X que puede devolver N registros y esos registros deben insertarse en una tabla Y....

Como hago esto?? sobre todo si devuelve, por ejemplo, 100 registros...??? es lo mismo si devolviera 1???

bueno...eso es lo que necesito.... si alguien puede ayudar

Gracias
El Mago de Oz
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #2 (permalink)  
Antiguo 23/07/2007, 18:47
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Select de N registros en Procedimiento Almacenado

¿Lo ejecutas mediante un JOB? (Cada cierto tiempo)
  #3 (permalink)  
Antiguo 24/07/2007, 10:09
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

efectivamente...pero ya lo solucioné con un registro...ahora voy a probar si funciona para n registros que seria lo interesante,,,sino debere usar un cursor por lo que he visto.... pero bueno,,,ahi le vamos.... si alguien quiere aportar algo, bienvenido...!!!

saludos..
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #4 (permalink)  
Antiguo 24/07/2007, 13:41
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Select de N registros en Procedimiento Almacenado

A ver, veamos, dijo un ciego.

Si devuelves "n" numero de registros, quiere decir que ese NUMERO es un PARAMETRO, puedes explicar un poco mas.

Gracias.
  #5 (permalink)  
Antiguo 24/07/2007, 14:34
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

mi SP no tiene parametros de entrada... yo defino variables en el mismo y hago un select y el resultado que pueden ser 1 como muchos registros deben ser insertados en una bd....aqui va un ejemplo:

CREATE PROCEDURE [dbo].[InsertaOrden]


as
@TipoOrden as char(3),
@Referencia as char(30),
@FechaEntrega as datetime
SELECT
@Referencia =ORDBGM.C1004,
@FechaEntrega =convert(nvarchar, [C2380],104),
FROM dbo.ORDBGM, dbo.ORDDTM,
WHERE ORDBGM.C1004 = ORDDTM.IdDoc
AND ORDBGM.C1004 = ORDSG28QTY.IdDoc

Set @TipoOrden= 'SN3'
Set @MaxLinea=10

insert into tbiawm (t_id,t_tipo,t_numdoc, t_pono)
values (@MaxLinea, @TipoOrden, @Referencia, @FechaEntrega)


el problema es que con mas de un registro en el SELECT solo inserta 1. lo cual es bastante logico.. el tema es como hacerlo para varios registros...

Saludos
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #6 (permalink)  
Antiguo 25/07/2007, 07:58
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

bueno... ya que no hay aportes... y mientras los esperaba... utilice cursores para poder trabajar el conjunto de registros... en todos lados donde vi la utilizacion de cursores decia que era no era lo óptimo... lo raro que nadie decia tampoco que es lo óptimo en su reemplazo y el como utilizarlo... pero bueno...

de todos modos a que se referirá con poco óptimo?? retrasa el trabajo un milisegundo?? un segundo?? 10 segundos??

bueno... ahi va...
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #7 (permalink)  
Antiguo 25/07/2007, 09:44
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Select de N registros en Procedimiento Almacenado

si tienes tablas grandes y los selects que realiza el cursor son numerosos te produce bloqueos de tablas, relentiza el server (excesivo consumo de recursos) y en general experimentas un bajo performace de tus aplicaciones.

Yo no te conteste porque la verdad no entiendi lo que quieres hacer, pero si posteas el sp que generaste con gusto te comento lo que se pudiera "segun yo" mejorar...

un saludo
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #8 (permalink)  
Antiguo 25/07/2007, 10:45
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Select de N registros en Procedimiento Almacenado

@TipoOrden as char(3),
@Referencia as char(30),
@FechaEntrega as DATETIME

Set @TipoOrden= 'SN3'
Set @MaxLinea=10

INSERT INTO tbiawm (t_id,t_tipo,t_numdoc, t_pono)
SELECT @MaxLinea, @TipoOrden, ORDBGM.C1004, convert(nvarchar, [C2380],104)
FROM dbo.ORDBGM JOIN dbo.ORDDTM,
ON ORDBGM.C1004 = ORDDTM.IdDoc
AND ORDBGM.C1004 = ORDSG28QTY.IdDoc
  #9 (permalink)  
Antiguo 25/07/2007, 11:09
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

el sp que genero es muy grande para postearlo acá la verdad pero en el fondo el tema es el que postee mas arriba...
1.- Un SP se ejecuta por medio de un job cada 1 minuto
2.- el SP hace un Select a una tabla y el resultado del select puede ser 1 o mas registros

el problema:

3.- si el select devuelve 1000 registros, por ejemplo, como lo hago para recorrer el select e insertar esos 1000 registros en otra tabla.

Eso... como dije...lo solucioné con un cursor.... pero... (los peros ya estan descritos mas arriba)...

No sé si iislas dió una solucion o solo me depuró el código que puse mas arriba... el cual es solo un ejemplo por si acaso... pero lo idea es mas o menos esa...


Saludos
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #10 (permalink)  
Antiguo 25/07/2007, 12:04
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Select de N registros en Procedimiento Almacenado

SQL SERVER, es un excelente motor para manejar GRANDES CANTIDADES DE DATOS, pero no fue diseñado para "recorrer registro por registro", por eso puse la solucion que estas pidiendo.

Saludos
  #11 (permalink)  
Antiguo 25/07/2007, 12:57
 
Fecha de Ingreso: junio-2007
Ubicación: El Salvador
Mensajes: 21
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

La solución que te plantea iislas, es muy buena deberias probarla.

Pero me llama la atencion que el JOB lo ejecutas cada 1 minuto ¿Que es lo que intentas hacer, una copia espejo de la tabla ?

Porque si es asi, podrias usar un TRIGGER para que en el instante mismo que se dá un INSERT en la tabla A , le pases una copia del registro a la tabla B.
  #12 (permalink)  
Antiguo 25/07/2007, 12:58
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Select de N registros en Procedimiento Almacenado

de acuerdo con iislas, los cursores recorren registro por registro, de ahi la necesidad de muchos recursos del server....

el code posteado, tambien es la forma correcta de insertar masivamente registros en una tabla...

si tienes alguna otra duda, por aqui andamos...
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #13 (permalink)  
Antiguo 25/07/2007, 13:45
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Pregunta Re: Select de N registros en Procedimiento Almacenado

Cita:
Iniciado por Andres95 Ver Mensaje
de acuerdo con iislas, los cursores recorren registro por registro, de ahi la necesidad de muchos recursos del server....

el code posteado, tambien es la forma correcta de insertar masivamente registros en una tabla...

si tienes alguna otra duda, por aqui andamos...
Perfecto... si la solución de iislas sirve hagamosla un poco mas dificil

les explico mi idea general...
estoy haciendo un desarrollo que implica el uso de varios programas (sql server, biztalk server, biztalk adapter for sql server, etc) para mensajeria...


este es el proceso general...

recibo un documento txt para procesarlo a traves de biztalk... éste lo carga en una BD (BD1)... donde quedan almacenados (por supuesto estan llegando mensajes txt via ftp, correo, etc en forma continua y ademas vienen cientos de datos)

mi SP (el que esta en cuestion) consulta a BD1 por los archivos nuevos recibidos en el ultimo minuto (por supuesto esto es variable, el tiempo no importa) donde el select trae solo ciertos campos (no necesito los cientos que se cargan en BD1) y la siguiente dificultad es esta:

si bien la opcion de iislas puede ser efectiva no me permite realizar otras operaciones...por ejemplo...

el resultado del select a BD1 me trae el rut del cliente y con ese rut yo quiero consultar otra BD (BD2) para obtener otros datos y asignarlo a otra variable cualquiera... (y asi podrian haber cientos de operaciones en medio) para recien luego de esto insertarlos en otra BD (BD3) (un weveo cierto???)

entonces el select me puede traer 50 rut distintos y por cada uno de ellos yo necesito ir a consultar a BD2 algo... esa es la idea general .... (puf!! me canse escribiendo esto...)

pero por ahi va la cosa!! (¿se entiende esta lesera o no???)

el asunto es que me resulta con cursores..ahora la pregunta es ¿hay otro modo?...
de nuevo por el "pero..." de los cursores...

saludos...
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #14 (permalink)  
Antiguo 25/07/2007, 13:58
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Select de N registros en Procedimiento Almacenado

puedes consultar las tablas de las distintas bds haciendo joins...
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #15 (permalink)  
Antiguo 25/07/2007, 14:12
 
Fecha de Ingreso: junio-2007
Ubicación: El Salvador
Mensajes: 21
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

Yo evaluaria el uso de un trigger:

Por ejemplo yo lo utilizo para sacar un par de campos de la tabla VIDEOS hacia la tabla TBLPDR100.

Código:
ALTER  TRIGGER InsTblpdr100 ON VIDEOS FOR INSERT 
AS 
insert into tblpdr100  select id,titulo,'0000' from inserted
dentro podrias hacer lo que quieras excepto retornar un valor.


De entrada te evitarias el job, porque el trigger se ejecutaria instantaneamente cuando se de un insert en la tabla de la BD1.

¿Que opinan?
  #16 (permalink)  
Antiguo 25/07/2007, 15:43
Avatar de el mago de oz  
Fecha de Ingreso: octubre-2005
Mensajes: 192
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Select de N registros en Procedimiento Almacenado

Efectivamente...tambien considere el trigger... pero por un problema que ni me esforcé en analizar (biztalk server no tiene mucha documentacion en español)... si aplico un trigger sobre una tabla que esta utilizando biztalk (entiendase insertar datos) se cae el SP que realiza la primera parte (cargar la BD1)

pk aca hay un conjunto de sp ejecutandose desde distintas partes... solo que el SP en cuestón es el "mas importante" ya que es el "centro" de todos los demas...

Saludos.
__________________
"No a las dictaduras, no a la impunidad, no al comercio injusto que explota al menor de edad. Sí a las autocracias, sí a la libertad, el tercer mundo va a estallar."
Finisterra MAGO DE OZ
  #17 (permalink)  
Antiguo 15/08/2007, 10:43
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Select de N registros en Procedimiento Almacenado

Asumuendo que tienes los datos importados dentro de una tabla (aunque sea temporal, o staging) dentro del servidor lo puedes hacer con:

INSERT INTO tabla_permanente (x,y,x)
SELECT x,y,z
FROM tabla_staging

De esa manera no importa si son 1, 10 o 10000 los registros. Funcionará bien y te libras del esperpento que son los cursores
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #18 (permalink)  
Antiguo 18/08/2007, 07:54
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Select de N registros en Procedimiento Almacenado

Y de los dolores de cabeza que dan los Trigers!.....

Para la comunicacion entre diversas BD incluso diversos Servidores tienes varias opciones..

Linked Servers ó DTS son las que yo evaluaría, el DTS lo puedes Jobear para que trabaje cada minuto como lo quieres.

Solo una recomendacion si en realidad puedes en esa consulta estar moviendo miles de registros.... "Cuidaos que vuestra tabla contenga los indices apropiados, y que los useis, si no quereis que cada minuto estes cometiendo un Servericidio!!!" .... Mal chiste.... :p


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #19 (permalink)  
Antiguo 18/08/2007, 07:56
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
De acuerdo Re: Select de N registros en Procedimiento Almacenado

Me acabo de dar cuenta que voy a llegar a mi post 200!!! que emoción!!!!

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #20 (permalink)  
Antiguo 13/06/2009, 12:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 73
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Re: Select de N registros en Procedimiento Almacenado

Cita:
Iniciado por Mithrandir Ver Mensaje
Asumuendo que tienes los datos importados dentro de una tabla (aunque sea temporal, o staging) dentro del servidor lo puedes hacer con:

INSERT INTO tabla_permanente (x,y,x)
SELECT x,y,z
FROM tabla_staging

De esa manera no importa si son 1, 10 o 10000 los registros. Funcionará bien y te libras del esperpento que son los cursores

bien ..... pero si lo que quiero hacer NO es un Insert sino operaciones con los resultados. Como el siguiente ejemplo:

Código:
DECLARE @position int
declare @cadena nvarchar(100)
declare @caracteres nvarchar(100)
declare @letra char

SET @position = 1
SET @cadena = 'todos los caracteres de una cadena sin repetir'
SET @caracteres = ''

WHILE @position <= len(@cadena)
BEGIN
	set @letra = SUBSTRING(@cadena, @position, 1)
	set @position = @position + 1

	if(charindex(@letra,@caracteres) = 0)
	begin
		set @caracteres = @caracteres + @letra
	end
END

select @caracteres
¿Lo único que me quedaría es un cursor como el que pongo a continuación? O ¿hay algo mejor?

Código:
DECLARE @position int
declare @cadena nvarchar(100)
declare @caracteres nvarchar(100)
declare @letra char

SET @caracteres = ''

declare CURSOR_LETRAS cursor for select lower(ltrim(rtrim(nombre))) from empresas
open CURSOR_LETRAS
fetch next from CURSOR_LETRAS into @cadena

while @@fetch_status = 0
begin
    --=================mis operaciones=======================
	SET @position = 1

	WHILE @position <= len(@cadena)
	BEGIN
		set @letra = SUBSTRING(@cadena, @position, 1)
		set @position = @position + 1

		if(charindex(@letra,@caracteres) = 0)
		begin
			set @caracteres = @caracteres + @letra
		end
	END
    --=======================================================

    fetch next from CURSOR_LETRAS into @cadena
end

close CURSOR_LETRAS
deallocate CURSOR_LETRAS

select @caracteres
Cabe destacar que para una tabla con más de 3400 registros y más de 40 columnas si tardo un poco, como decían por ahí parece que los cursores no son lo optimo o tal vez por lo lento de las operaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:09.