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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 Jonathan Chacón
03/02/2005 - 17:42 | Informe spam
Hola:

Trata,

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




que es eso de newid() ??
Es que no entiendo lo que me quieres indicar... será que ya llevo demasiadas
horas hoy con este problema :-)


mañana lo pruebo que la base de datos la tengo en otro equipo...


Saludos
Jonathan Chacón
Respuesta Responder a este mensaje
#3 Alejandro Mesa
03/02/2005 - 18:23 | Informe spam
La funcion NEWID() crea un valor unico de tipo uniqueidentifier. Si sql
server esta montado en windows 2000 server o mayor, entonces es seguro de que
este valor es randomico. SQL Server va a ordenar el resultado basado en este
valor y retornara el primero, como el valor es randomico entonces el
ordenamiento lo es tambien.

Ejemplo:

use northwind
go

select top 1 orderid from orders order by newid()
go

Si ejecutas el script anterior, veras que el resultado siempre es diferente.


AMB

"Jonathan Chacón" wrote:

Hola:

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


que es eso de newid() ??
Es que no entiendo lo que me quieres indicar... será que ya llevo demasiadas
horas hoy con este problema :-)


mañana lo pruebo que la base de datos la tengo en otro equipo...


Saludos
Jonathan Chacón



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida