Problemas con el top

03/02/2005 - 17:20 por Jonathan Chacón | Informe spam
Hola:
Necesito crear un procedimiento que me seleccione una pregunta para un
examen de la tabla EV_Preguntas. Pero no puedo usar cursores. Así que se me
ocurrió la idea de hacer un select con un top de X elementos, ordenandolo en
orden inverso, y hacer un select de ese select anterior con un top 1,con lo
que se mostrará sólo el Id de la pregunta seleccionada...
Pues nada, me puse manos a la obra pero...

Al intentar hacer lo siguiente en el procedimiento almacenado me da un
error:

create procedure...

[...]

declare @num_preguntas as int
declare @Cod_pregunta as char(4)

[...]

Set @Num_preguntas = ( Rand() *100 ) +1 -- Seleccionamos número al azar

[...]

select top 1 @Cod_Pregunta = Id
from EV_Preguntas
where Id in
(Select top @Num_preguntas Id
from EV_Preguntas
order by Id Desc)

[...]

al indicar top @Num_preguntas me dice que sintaxis incorrecta, pero si pongo
un número, sin problemas...

Pues opté por la siguiente solución:

Crear una cadena con la sentencia:

declare @cadena as Varchar(300)

Asignar la sentencia sql:

set @cadena = 'Select top 1 ... '

Y donde vaya @Num_preguntas hacer:

... ' + Cast (@Num_preguntas as Varchar) + ' ...

y ejecutarla:

exec (@Cadena)


El problema es que me dice que debo declarar la variable @Cod_Pregunta...


He pensado en quitar de la cadena lo siguiente:

select top 1 @Cod_pregunta = id from ...

y dejarlo así:

select top 1 Id from


pero necesito recoger el Id devuelto por el select y almacenarlo en
@Cod_Pregunta...

Alguna idea de cómo hacerlo?


Saludos y gracias
Jonathan Chacón
 

Leer las respuestas

#1 Alejandro Mesa
03/02/2005 - 17:35 | Informe spam
Trata,

select top 1
@Cod_Pregunta = Id
from
EV_Preguntas
order by
newid()
go

Debes tener sql server en windows 2000 server o mayor.


AMB

"Jonathan Chacón" wrote:

Hola:
Necesito crear un procedimiento que me seleccione una pregunta para un
examen de la tabla EV_Preguntas. Pero no puedo usar cursores. Así que se me
ocurrió la idea de hacer un select con un top de X elementos, ordenandolo en
orden inverso, y hacer un select de ese select anterior con un top 1,con lo
que se mostrará sólo el Id de la pregunta seleccionada...
Pues nada, me puse manos a la obra pero...

Al intentar hacer lo siguiente en el procedimiento almacenado me da un
error:

create procedure...

[...]

declare @num_preguntas as int
declare @Cod_pregunta as char(4)

[...]

Set @Num_preguntas = ( Rand() *100 ) +1 -- Seleccionamos número al azar

[...]

select top 1 @Cod_Pregunta = Id
from EV_Preguntas
where Id in
(Select top @Num_preguntas Id
from EV_Preguntas
order by Id Desc)

[...]

al indicar top @Num_preguntas me dice que sintaxis incorrecta, pero si pongo
un número, sin problemas...

Pues opté por la siguiente solución:

Crear una cadena con la sentencia:

declare @cadena as Varchar(300)

Asignar la sentencia sql:

set @cadena = 'Select top 1 ... '

Y donde vaya @Num_preguntas hacer:

' + Cast (@Num_preguntas as Varchar) + ' ...

y ejecutarla:

exec (@Cadena)


El problema es que me dice que debo declarar la variable @Cod_Pregunta...


He pensado en quitar de la cadena lo siguiente:

select top 1 @Cod_pregunta = id from ...

y dejarlo así:

select top 1 Id from


pero necesito recoger el Id devuelto por el select y almacenarlo en
@Cod_Pregunta...

Alguna idea de cómo hacerlo?


Saludos y gracias
Jonathan Chacón



Preguntas similares