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

SELECT TOP con número variable

Estas en el tema de SELECT TOP con número variable en el foro de SQL Server en Foros del Web. Muy buenas. ALTER PROCEDURE PA_LibroDelDia ( @nDias int ) AS BEGIN DECLARE @posi int SET @posi = @nDias % (SELECT COUNT(*) FROM Libros) SELECT TOP ...
  #1 (permalink)  
Antiguo 21/09/2006, 04:46
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
SELECT TOP con número variable

Muy buenas.

ALTER PROCEDURE PA_LibroDelDia
(
@nDias int
)
AS
BEGIN
DECLARE @posi int
SET @posi = @nDias % (SELECT COUNT(*) FROM Libros)
SELECT TOP @posi * FROM Libros
END

Por qué me dice: Línea 9: sintaxis incorrecta cerca de 'posi'

Gracias.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 21/09/2006, 10:30
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
talvez deberías concatenar el string del select, almacenarlo en una variable nvarchar y mandar a ejecutar lo almacenado
  #3 (permalink)  
Antiguo 21/09/2006, 21:21
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Seguramente la cifra del TOP no sea algo que puedas usar en variables.

Tu caso es un ambiente perfectamente controlado donde el SQL dinámico es permitido. Prueba esto:

ALTER PROCEDURE PA_LibroDelDia
(
@nDias int
)
AS
BEGIN
DECLARE @posi int
DECLARE @sql NVarChar(500)
SET @posi = @nDias % (SELECT COUNT(*) FROM Libros)
SET @sql='SELECT TOP ' + Convert(NVarChar, @posi) + ' * FROM Libros'
EXEC sp_executesql @sql
END
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #4 (permalink)  
Antiguo 22/09/2006, 07:54
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
comentario:
la version 2005 de SQL Server incluye como mejora de T-SQL el uso de una expresion para el valor del TOP.
Esta padre no? ya no se requieren trucos para hacer algo que debe ser sencillo... jejeje
  #5 (permalink)  
Antiguo 22/09/2006, 08:33
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Y como quedaría?
  #6 (permalink)  
Antiguo 22/09/2006, 08:40
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Código:
SELECT TOP (@posi) * FROM Libros
Tambien se puede...
Código:
SELECT TOP (Select count(*) from OtraTabla) * FROM Libros
  #7 (permalink)  
Antiguo 25/09/2006, 03:33
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Perdón por no contestar, no he recibido los mensajes de aviso de respuesta.

Bien, la solución estaba por usar SQL dinámico ya que tengo SQL Server 2000. Funciona bien, pero me ha surgido un problema al intentar darle una vuelta de tuerca al asunto. Si intento que también la tabla sobre la que se hacen las consultas se establezca dinámicamente me empieza a dar errores de sintaxis junto a EXECUTE:

Código:
ALTER PROCEDURE PA_LibroDelDia
(
	@nDias int,
	@tabla varchar(50)
)
AS
BEGIN
	DECLARE @vSQL varchar(1000), @posi int
	SELECT @vSQL = '(' + CONVERT(varchar,@nDias) + ' % (SELECT COUNT(*) FROM ' + @tabla + ') )+1'
	SELECT @posi = EXECUTE(@vSQL)
	SELECT @vSQL = 'SELECT TOP 1 tope.*  FROM (SELECT TOP ' + CONVERT(varchar,@posi) + ' * FROM ' + @tabla + ' ORDER BY id) AS tope ORDER BY id DESC'
	
	EXECUTE(@vSQL)
END
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #8 (permalink)  
Antiguo 25/09/2006, 07:33
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
debido a que el execute se ejecuta en otro contexto diferente al sp que lo está llamando... no puedes compartir ni regresar variables....

para eso tendrias que hacer una tabla temporal y grabar ahi el valor obtenido desde el execute y luego en el sp obtener ese valor.

con tu ejemplo quedaria mas o menos asi...

Código:
DECLARE @vSQL varchar(1000), @posi int, @valor int

If Object_ID ('tempdb..#tmpValor') is not null
	Drop table #tmpValor 

create table #tmpValor (valor int) 

Execute ('Insert into #tmpValor(valor) Select count(*) from ' + @Tabla )

If (Select count(*) from #tmpValor)> 0
Begin
	Select Top 1 @valor = valor from #tmpValor 		
	Set @posi = @nDias % @valor
	Execute ('SELECT TOP 1 tope.*  FROM (SELECT TOP ' + CONVERT(varchar,@posi) + ' * FROM ' + @tabla + ' ORDER BY id) AS tope ORDER BY id DESC')
End

If Object_ID ('tempdb..#tmpValor') is not null
	Drop table #tmpValor
  #9 (permalink)  
Antiguo 25/09/2006, 08:08
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Entiendo. Muchas gracias, voy a probarlo.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #10 (permalink)  
Antiguo 28/09/2006, 16:44
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
EXEC (@sql) sucks!

sp_executesql te permite el intercambio de variables entre otras monerías.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #11 (permalink)  
Antiguo 28/09/2006, 17:00
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
intercambio ??
como seria para que te regrese un valor en una variable??
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #12 (permalink)  
Antiguo 28/09/2006, 17:18
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Un ejemplo del BOL vale más que mil palabras (digo, teclazos ):

Código:
DECLARE @IntVariable INT
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)

/* Build the SQL string once.*/
SET @SQLString =
     N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint'
/* Execute the string with the first parameter value. */
SET @IntVariable = 35
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable
/* Execute the same string with the second parameter value. */
SET @IntVariable = 32
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #13 (permalink)  
Antiguo 28/09/2006, 17:31
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
bueno de hecho, le envias valores...
pero no te regresa nada.. a excepcion de los result sets.
por ejemplo si quisiera saber la cuenta de esos registros??
3 y 1 respectivamente... sin usar una temporal... como seria??
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #14 (permalink)  
Antiguo 29/09/2006, 23:45
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Usando variables de salida dentro de la llamada. Si mal no recuerdo alguna vez lo hice funcionar, aunque no recuerdo ni por donde...

EXECUTE sp_executesql @SQLString, @ParmDefinition, @level OUTPUT
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #15 (permalink)  
Antiguo 30/09/2006, 11:06
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Las variables de salida las tienes que declarar dentro del procedimientos como output, y no necesitas especificar valor alguno en la llamada al procedimiento
  #16 (permalink)  
Antiguo 02/10/2006, 07:34
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
pues les comento porque ya lo he buscado y no le encontre...
si tienen un ejemplo seria muy bueno... jejjeje
y asi me quitaria por fin esas latosas tablas temporales...
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.
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 21:07.