Alguna manera de acceder a los resultados de un exec desde fuera

28/09/2005 - 22:45 por Oscar Calvo | Informe spam
Hola a todos,

Tengo un procedimiento almacenado en el que tengo que hacer una busqueda en
varias tablas hacia atras hasta que encuentre un determinado dato.Las tablas
stan numeradas por meses, por lo que debo crear la consulta dinamicamente y
ejecutarla con un exec.Hasta ahora, componia la consulta de todas las tablas
juntas mediante "union" y la ejecutaba.Esto no es nada optimo,ya que
entonces estoy buscando en todas las tablas,cuando lo que debo hacer es
buscar en la primera, y solo si no lo encuentro,seguir por la siguiente etc.
Es decir hasta ahora hacia
set @consulta='select * from tabla1 where... union 'select * from tabla2
where... ' (como digo en principio no se el nombre de las tablas).
y al final el procedimiento exec(@consulta)
La cosa es que si solo busco en una,como se si me devuelve resultados y que
no debo seguir buscando?
Las tablas son muy pesadas, y este procedimiento tiene mucho uso, por lo que
crear tablas temporales y demas cosas extrañas casi lo descarto.

Como soleis hacer esto vosotros?

Gracias y un saludo.

Preguntas similare

Leer las respuestas

#11 Gustavo Larriera [MVP]
02/10/2005 - 03:55 | Informe spam
Lo que entendí de tu mensaje original es que compones con sql dinámico la
unión de tablas (dijiste: "Hasta ahora, componia la consulta de todas las
tablas juntas mediante 'union' y la ejecutaba") y que querías optimizarlo
verificando tabla a tabla si estaba el dato ("cuando lo que debo hacer es
buscar en la primera, y solo si no lo encuentro,seguir por la siguiente ").

Entonces mi propuesta es que hagas un sproc que va construyendo la UNION de
solamente aquellas tablas que tienen el dato que buscas, y que para ello
deberás usar IF EXISTS.

Algo así (pseudoalgoritmo):

StringSql empieza vacío
Si Existe el Dato en la Tabla 1
Agrego al string Sql el Union de Tabla1
Si Existe el Dato en la Tabla 2
Agrego al string Sql el Union de Tabla2
. . .
Ejecuto el sql dinamico del string Sql

Gustavo Larriera
Uruguay LatAm
Blog: http://sqljunkies.com/weblog/gux/
MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Oscar Calvo" wrote in message
news:
Perdona Gustavo, pero no te entiendo.
Como puedo hacer el "IF EXISTS(SELECT dato FROM tabla1 WHERE condicion)"
si
no se el nombre de "tabla1"?
Es decir, segun el mes en el que este debo buscar en una tabla u otra, y
es
por esto por lo que construyo la tabla dinamicamente.
A que te refieres?

Gracias y un saludo.


"Gustavo Larriera [MVP]" escribió en el mensaje
news:#
Programa algo usando esto:

IF EXISTS(SELECT dato FROM tabla1 WHERE condicion)
ELSE

Segun exista o no el dato en cada tabla, vas construyendo la sentencia


SLECT
UNION que necesitas para ejecutar luego dinámicamente.

Gustavo Larriera
Uruguay LatAm
Blog: http://sqljunkies.com/weblog/gux/
MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers
no rights.
"Oscar Calvo" wrote in message
news:
> Hola a todos,
>
> Tengo un procedimiento almacenado en el que tengo que hacer una
> busqueda
> en
> varias tablas hacia atras hasta que encuentre un determinado dato.Las
> tablas
> stan numeradas por meses, por lo que debo crear la consulta


dinamicamente
> y
> ejecutarla con un exec.Hasta ahora, componia la consulta de todas las
> tablas
> juntas mediante "union" y la ejecutaba.Esto no es nada optimo,ya que
> entonces estoy buscando en todas las tablas,cuando lo que debo hacer es
> buscar en la primera, y solo si no lo encuentro,seguir por la siguiente
> etc.
> Es decir hasta ahora hacia
> set @consulta='select * from tabla1 where... union 'select * from
> tabla2
> where... ' (como digo en principio no se el nombre de las tablas).
> y al final el procedimiento exec(@consulta)
> La cosa es que si solo busco en una,como se si me devuelve resultados y
> que
> no debo seguir buscando?
> Las tablas son muy pesadas, y este procedimiento tiene mucho uso, por
> lo
> que
> crear tablas temporales y demas cosas extrañas casi lo descarto.
>
> Como soleis hacer esto vosotros?
>
> Gracias y un saludo.
>
>






Respuesta Responder a este mensaje
#12 Oscar Calvo
02/10/2005 - 15:04 | Informe spam
Eso es exactamente lo que quiero, pero lo que no se es como hacer la
comprobacion de si existe gustavo.
Si la consulta es dinamica, como compruebo si existe ese dato.Realmente si
pudiera mirar esto ya no haria falta el union ya que solo debo buscar hasta
que encuentre ese dato.
Es decir si hago

set @consulta='select * from '+@nombretabla+' where ...'
exec(@consulta)

Como puedo saber si devuelve o no resulados el exec?

O bien como tu planteas, a la hora de "Si Existe el Dato en la Tabla 1
Agrego al string Sql el Union de Tabla1
"
Como puedo hacer esta comprobacion?

Gracias y un saludo.



"Gustavo Larriera [MVP]" escribió en el mensaje
news:
Lo que entendí de tu mensaje original es que compones con sql dinámico la
unión de tablas (dijiste: "Hasta ahora, componia la consulta de todas las
tablas juntas mediante 'union' y la ejecutaba") y que querías optimizarlo
verificando tabla a tabla si estaba el dato ("cuando lo que debo hacer es
buscar en la primera, y solo si no lo encuentro,seguir por la siguiente


").

Entonces mi propuesta es que hagas un sproc que va construyendo la UNION


de
solamente aquellas tablas que tienen el dato que buscas, y que para ello
deberás usar IF EXISTS.

Algo así (pseudoalgoritmo):

StringSql empieza vacío
Si Existe el Dato en la Tabla 1
Agrego al string Sql el Union de Tabla1
Si Existe el Dato en la Tabla 2
Agrego al string Sql el Union de Tabla2
. . .
Ejecuto el sql dinamico del string Sql

Gustavo Larriera
Uruguay LatAm
Blog: http://sqljunkies.com/weblog/gux/
MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Oscar Calvo" wrote in message
news:
> Perdona Gustavo, pero no te entiendo.
> Como puedo hacer el "IF EXISTS(SELECT dato FROM tabla1 WHERE condicion)"
> si
> no se el nombre de "tabla1"?
> Es decir, segun el mes en el que este debo buscar en una tabla u otra, y
> es
> por esto por lo que construyo la tabla dinamicamente.
> A que te refieres?
>
> Gracias y un saludo.
>
>
> "Gustavo Larriera [MVP]" escribió en el


mensaje
> news:#
>> Programa algo usando esto:
>>
>> IF EXISTS(SELECT dato FROM tabla1 WHERE condicion)
>> ELSE
>>
>> Segun exista o no el dato en cada tabla, vas construyendo la sentencia
> SLECT
>> UNION que necesitas para ejecutar luego dinámicamente.
>>
>> Gustavo Larriera
>> Uruguay LatAm
>> Blog: http://sqljunkies.com/weblog/gux/
>> MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
>> Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga


ningun
>> derecho / This posting is provided "AS IS" with no warranties, and
>> confers
>> no rights.
>> "Oscar Calvo" wrote in message
>> news:
>> > Hola a todos,
>> >
>> > Tengo un procedimiento almacenado en el que tengo que hacer una
>> > busqueda
>> > en
>> > varias tablas hacia atras hasta que encuentre un determinado dato.Las
>> > tablas
>> > stan numeradas por meses, por lo que debo crear la consulta
> dinamicamente
>> > y
>> > ejecutarla con un exec.Hasta ahora, componia la consulta de todas las
>> > tablas
>> > juntas mediante "union" y la ejecutaba.Esto no es nada optimo,ya que
>> > entonces estoy buscando en todas las tablas,cuando lo que debo hacer


es
>> > buscar en la primera, y solo si no lo encuentro,seguir por la


siguiente
>> > etc.
>> > Es decir hasta ahora hacia
>> > set @consulta='select * from tabla1 where... union 'select * from
>> > tabla2
>> > where... ' (como digo en principio no se el nombre de las tablas).
>> > y al final el procedimiento exec(@consulta)
>> > La cosa es que si solo busco en una,como se si me devuelve resultados


y
>> > que
>> > no debo seguir buscando?
>> > Las tablas son muy pesadas, y este procedimiento tiene mucho uso, por
>> > lo
>> > que
>> > crear tablas temporales y demas cosas extrañas casi lo descarto.
>> >
>> > Como soleis hacer esto vosotros?
>> >
>> > Gracias y un saludo.
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#13 Gustavo Larriera [MVP]
02/10/2005 - 23:57 | Informe spam
Veamos si esto te es de utilidad: Usa @@rowcount para saber si la ejecución
dinámica de SQL trajo resultados. Más abajo escribí un ejemplo para que
consideres.

"Oscar Calvo" wrote in message
news:
[...]
Es decir si hago

set @consulta='select * from '+@nombretabla+' where ...'
exec(@consulta)

Como puedo saber si devuelve o no resulados el exec?



use pubs
go

declare @consulta nvarchar(1000)
declare @nombretabla sysname
declare @resultados bigint

set @nombretabla = 'titles'


set @consulta=N'select * from '+@nombretabla+N' where price > 10'

exec(@consulta)

set @resultados = @@rowcount

if @resultados > 0
print 'existen datos'
else
print 'no hay datos'


Saludos
~gux
Respuesta Responder a este mensaje
#14 Oscar Calvo
04/10/2005 - 20:05 | Informe spam
Te conteste ayer gustavo, pero debio de haber algun error.
Tiene muy buena pinta lo que propones.@@rowcount solo afecta a la conexion
actual? es decir, si tengo dos usuarios concurrentes,siempre me va a
devolver el que corresponde no? porque segun creo @@identity si devuelve el
ultimo, con lo cual podria haber problemas.

Gracias por la respuesta, me has ayudado mucho.Un saludo.



"Gustavo Larriera [MVP]" escribió en el mensaje
news:#
Veamos si esto te es de utilidad: Usa @@rowcount para saber si la


ejecución
dinámica de SQL trajo resultados. Más abajo escribí un ejemplo para que
consideres.

"Oscar Calvo" wrote in message
news:
[...]
> Es decir si hago
>
> set @consulta='select * from '+@nombretabla+' where ...'
> exec(@consulta)
>
> Como puedo saber si devuelve o no resulados el exec?

use pubs
go

declare @consulta nvarchar(1000)
declare @nombretabla sysname
declare @resultados bigint

set @nombretabla = 'titles'


set @consulta=N'select * from '+@nombretabla+N' where price > 10'

exec(@consulta)

set @resultados = @@rowcount

if @resultados > 0
print 'existen datos'
else
print 'no hay datos'


Saludos
~gux


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