In o Varios select

28/09/2006 - 00:03 por MAbanto | Informe spam
Amigos una consulta, tengo que hacer un select ( con union ) pero mi
condicion es de varias posibilidades. Ejemplo:

Select *
from tabla1
where vehiculo in ('1','2','3')
union
Select *
from tabla2
where vehiculo in ('1','2','3')

para eso lo concatene ( porque lo buses viene como cadena en un parametro) y
lo ejecuto con el exec, o mejor sera hacer varios selects y colocarlo en un
@tabla

que me aconsejan?

Preguntas similare

Leer las respuestas

#1 Luis Tarzia
28/09/2006 - 07:39 | Informe spam
El in funciona bien
"MAbanto" wrote in message
news:
Amigos una consulta, tengo que hacer un select ( con union ) pero mi
condicion es de varias posibilidades. Ejemplo:

Select *
from tabla1
where vehiculo in ('1','2','3')
union
Select *
from tabla2
where vehiculo in ('1','2','3')

para eso lo concatene ( porque lo buses viene como cadena en un parametro)


y
lo ejecuto con el exec, o mejor sera hacer varios selects y colocarlo en


un
@tabla

que me aconsejan?

Respuesta Responder a este mensaje
#2 MAbanto
28/09/2006 - 15:24 | Informe spam
Pero una vez lei un articulo en cual se explicaba que al ejecutar con exec se
compilada en cada ejcucion... es asi?

"Luis Tarzia" wrote:

El in funciona bien
"MAbanto" wrote in message
news:
> Amigos una consulta, tengo que hacer un select ( con union ) pero mi
> condicion es de varias posibilidades. Ejemplo:
>
> Select *
> from tabla1
> where vehiculo in ('1','2','3')
> union
> Select *
> from tabla2
> where vehiculo in ('1','2','3')
>
> para eso lo concatene ( porque lo buses viene como cadena en un parametro)
y
> lo ejecuto con el exec, o mejor sera hacer varios selects y colocarlo en
un
> @tabla
>
> que me aconsejan?
>



Respuesta Responder a este mensaje
#3 Miguel Egea
28/09/2006 - 15:30 | Informe spam
varias cosas
1.- union o union all, union al final te hara la intersección de los dos
resultados buscando eliminar duplicados, si so es necesario mantenlo, pero
si no, quítalo.
2.- supongo que lo que te viene como parámetro son los valores 1,2,3, aunque
no entiendo realmente bien tu mensaje. Si es así tengo un script basado en
una idea original del maestro Itzik Ben Gan que puede ayudarte a evitar la
ejecución dinámica, está desarrollada para 2005, aunque lo único exclusivo
de 2005 es que utilizo una cte para rellenar una tabla con los números del 1
al 10000, eso, obviamente se puede hacer sin CTE's pero es menos chulo :)



CREATE TABLE #NUMS( valor smallint not null primary key)

go



WITH myCte AS

(

SELECT 1 valor

UNION ALL

SELECT valor+1 FROM myCTE WHERE valor<10000

)

INSERT INTO #NUMS (valor)

SELECT valor FROM MYcte OPTION(MAXRECURSION 0)

go



DECLARE @Cadena VARCHAR(MAX)

SET @Cadena=',1,22,333,444'



SELECT substring(cadena,valor+1,case when
patindex('%,%',substring(cadena,valor+1,len(caDENA)))>0

then
patindex('%,%',substring(cadena,valor+1,len(caDENA))) -1

else len(cadena)

end)

FROM (SELECT @Cadena Cadena) Cad

INNER JOIN #nums n

on valor<len(cadena)

AND substring(cadena,valor,1)=','



go

drop table #nums



3.- Por otra parte, la ejecución dinámica es un peligro, piensa en que te
pasaría si tu cadena valiese algo así '1,2,3) drop table MiTabla --', con
ejecución dinámica, es muy probable que tu tabla acabase como un mero
recuerdo en el log de transacciones (problemas de inyección de código SQL)






"MAbanto" wrote in message
news:
Amigos una consulta, tengo que hacer un select ( con union ) pero mi
condicion es de varias posibilidades. Ejemplo:

Select *
from tabla1
where vehiculo in ('1','2','3')
union
Select *
from tabla2
where vehiculo in ('1','2','3')

para eso lo concatene ( porque lo buses viene como cadena en un parametro)
y
lo ejecuto con el exec, o mejor sera hacer varios selects y colocarlo en
un
@tabla

que me aconsejan?

Respuesta Responder a este mensaje
#4 MAbanto
28/09/2006 - 16:19 | Informe spam
Excelente Miguel!!!! muchas gracias, pero otra consulta enmic aso en el proc
estabba concatenando todo el select ( no es que venga desde el cliente ) osea
en el proc tengo:
select * from codigo in @param

En ese caso no habria peligro de inyeccion no?

"Miguel Egea" wrote:

varias cosas
1.- union o union all, union al final te hara la intersección de los dos
resultados buscando eliminar duplicados, si so es necesario mantenlo, pero
si no, quítalo.
2.- supongo que lo que te viene como parámetro son los valores 1,2,3, aunque
no entiendo realmente bien tu mensaje. Si es así tengo un script basado en
una idea original del maestro Itzik Ben Gan que puede ayudarte a evitar la
ejecución dinámica, está desarrollada para 2005, aunque lo único exclusivo
de 2005 es que utilizo una cte para rellenar una tabla con los números del 1
al 10000, eso, obviamente se puede hacer sin CTE's pero es menos chulo :)



CREATE TABLE #NUMS( valor smallint not null primary key)

go



WITH myCte AS

(

SELECT 1 valor

UNION ALL

SELECT valor+1 FROM myCTE WHERE valor<10000

)

INSERT INTO #NUMS (valor)

SELECT valor FROM MYcte OPTION(MAXRECURSION 0)

go



DECLARE @Cadena VARCHAR(MAX)

SET @Cadena=',1,22,333,444'



SELECT substring(cadena,valor+1,case when
patindex('%,%',substring(cadena,valor+1,len(caDENA)))>0

then
patindex('%,%',substring(cadena,valor+1,len(caDENA))) -1

else len(cadena)

end)

FROM (SELECT @Cadena Cadena) Cad

INNER JOIN #nums n

on valor<len(cadena)

AND substring(cadena,valor,1)=','



go

drop table #nums



3.- Por otra parte, la ejecución dinámica es un peligro, piensa en que te
pasaría si tu cadena valiese algo así '1,2,3) drop table MiTabla --', con
ejecución dinámica, es muy probable que tu tabla acabase como un mero
recuerdo en el log de transacciones (problemas de inyección de código SQL)






"MAbanto" wrote in message
news:
> Amigos una consulta, tengo que hacer un select ( con union ) pero mi
> condicion es de varias posibilidades. Ejemplo:
>
> Select *
> from tabla1
> where vehiculo in ('1','2','3')
> union
> Select *
> from tabla2
> where vehiculo in ('1','2','3')
>
> para eso lo concatene ( porque lo buses viene como cadena en un parametro)
> y
> lo ejecuto con el exec, o mejor sera hacer varios selects y colocarlo en
> un
> @tabla
>
> que me aconsejan?
>



Respuesta Responder a este mensaje
#5 Miguel Egea
28/09/2006 - 23:44 | Informe spam
eso depende como lo hagas, si el usuario puede intervenir, aunque sea de
forma indirecta, no te libras...


"MAbanto" wrote in message
news:
Excelente Miguel!!!! muchas gracias, pero otra consulta enmic aso en el
proc
estabba concatenando todo el select ( no es que venga desde el cliente )
osea
en el proc tengo:
select * from codigo in @param

En ese caso no habria peligro de inyeccion no?

"Miguel Egea" wrote:

varias cosas
1.- union o union all, union al final te hara la intersección de los dos
resultados buscando eliminar duplicados, si so es necesario mantenlo,
pero
si no, quítalo.
2.- supongo que lo que te viene como parámetro son los valores 1,2,3,
aunque
no entiendo realmente bien tu mensaje. Si es así tengo un script basado
en
una idea original del maestro Itzik Ben Gan que puede ayudarte a evitar
la
ejecución dinámica, está desarrollada para 2005, aunque lo único
exclusivo
de 2005 es que utilizo una cte para rellenar una tabla con los números
del 1
al 10000, eso, obviamente se puede hacer sin CTE's pero es menos chulo :)



CREATE TABLE #NUMS( valor smallint not null primary key)

go



WITH myCte AS

(

SELECT 1 valor

UNION ALL

SELECT valor+1 FROM myCTE WHERE valor<10000

)

INSERT INTO #NUMS (valor)

SELECT valor FROM MYcte OPTION(MAXRECURSION 0)

go



DECLARE @Cadena VARCHAR(MAX)

SET @Cadena=',1,22,333,444'



SELECT substring(cadena,valor+1,case when
patindex('%,%',substring(cadena,valor+1,len(caDENA)))>0

then
patindex('%,%',substring(cadena,valor+1,len(caDENA))) -1

else len(cadena)

end)

FROM (SELECT @Cadena Cadena) Cad

INNER JOIN #nums n

on valor<len(cadena)

AND substring(cadena,valor,1)=','



go

drop table #nums



3.- Por otra parte, la ejecución dinámica es un peligro, piensa en que te
pasaría si tu cadena valiese algo así '1,2,3) drop table MiTabla --', con
ejecución dinámica, es muy probable que tu tabla acabase como un mero
recuerdo en el log de transacciones (problemas de inyección de código
SQL)






"MAbanto" wrote in message
news:
> Amigos una consulta, tengo que hacer un select ( con union ) pero mi
> condicion es de varias posibilidades. Ejemplo:
>
> Select *
> from tabla1
> where vehiculo in ('1','2','3')
> union
> Select *
> from tabla2
> where vehiculo in ('1','2','3')
>
> para eso lo concatene ( porque lo buses viene como cadena en un
> parametro)
> y
> lo ejecuto con el exec, o mejor sera hacer varios selects y colocarlo
> en
> un
> @tabla
>
> que me aconsejan?
>



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