Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Query dinamico sin usar Exec (@sql)

0 views
Skip to first unread message

Jorge Aguilar

unread,
Mar 29, 2006, 6:21:30 PM3/29/06
to
Hola a todos, quisiera hacer un select sin ponerlo en ua variable, estq query de abajo funciona, pero lo quisiera hacer sin usar una variable@sql, No se pueden cambiar los tipos de datos ya que son los mismos de la base de datos
declare @id_pais char(2),
 @id_region char(2),
 @id_zona char(6),
 @sql varchar(1000)
set @id_pais='PE'
SET @id_region = '11'
set @id_zona = null
set @sql ='select * from facturacion where flg_anulado=0 and id_pais =
'''+@id_pais+''' and id_region = '''+@id_region+''' and
id_zona like ''%'+isnull(rtrim(@id_zona),'')+'%'''
exec (@sql)
 
Es decir lo que quiero es algo ya que las variables region y/o zona pueden ser nulas y quisersa tyener un solo select en vez de ir armando el select en variables por ejemplo
declare @id_pais char(2),
 @id_region char(2),
 @id_zona char(6),
 @sql varchar(1000)
set @id_pais='PE'
SET @id_region = '11'
set @id_zona = null
select * from facturacion where flg_anulado=0 and id_pais =
@id_pais and id_region like @id_region and id_zona like @id_zona
 
gracias
Jorge

Maxi [MVP]

unread,
Mar 29, 2006, 6:31:08 PM3/29/06
to
Jorge, como estas?
 
Has probado con isnull?
 
o sea
 
Select campos from tabla
where campo1 like isnull(@campo1,'%') and
campo2 like isnull(@campo2,'%') ....

--

Salu2
-------------------------------------------------
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org
---------------------------------------------------
MSN: Maxi_a...@msn.com
"Jorge Aguilar" <jaa...@gmail.com> escribió en el mensaje news:e16HLe4U...@TK2MSFTNGP12.phx.gbl...

Alejandro Mesa

unread,
Mar 30, 2006, 2:11:07 PM3/30/06
to
Jorge,

Una opcion es usar la funcion "isnull" como indico Maxi. Te recomiendo ser
precavido cuando usas el operador "like" con variables "char" pues sql server
añadira espacios a la variable para completar la longitud declarada.

Ejemplo:

use northwind
go

-- seleccionar todos los customers
-- cuyo id comienza con 'A'
declare @customerid nchar(5)

set @customerid = 'a'

select * from dbo.customers where customerid like @customerid + '%'
go

Te sorprendaras porque esta sentencia no traera fila alguna. SQL Server
expande la variable y en realidad lo que procesara es algo parecido a esto:

select * from dbo.customers where customerid like 'a %'

Te das cuenta lo que pasa?

Preferible que declares la variable como varchar / nvarchar.

use northwind
go

-- seleccionar todos los customers
-- cuyo id comienza con 'A'
declare @customerid nvarchar(5)

set @customerid = 'a'

select * from dbo.customers where customerid like @customerid + '%'
go

Ahora si funciona, verdad?

OK, la otra opcion que se recomienda es el uso del procedimiento
sp_executesql.

declare @id_pais char(2)
declare @id_region char(2)
declare @id_zona varchar(6)
declare @sql nvarchar(4000)
declare @par_list nvarchar(4000)

set @id_pais='PE'
SET @id_region = '11'
set @id_zona = null

set @par_lst = N'@id_pais char(2), @id_region char(2), @id_zona char(6)'
set @sql = N'select * from facturacion where flg_anulado=0'

if @id_pais is not null
set @sql = @sql + ' and id_pais = @id_pais'

if @id_region is not null
set @sql = @sql + ' and id_region = @id_region'

if @id_zona is not null
set @sql = @sql + 'and id_zona like ''%'' + @id_zona + ''%'''

print @sql

exec sp_executesql @sql, @par_list, @id_pais, @id_region, @id_zona
go

De esta forma te evitas muchos problemas y/o trabajos como:

- No debes hacer conversiones de otros tipos de datos como numericos,
fechas, etc
para que estos se concatenen a la cadena

- No te debes preocuparte de usar apostrofes para encerrar valores tipo
fecha o caracteres cuando usas el operador de igualdad

- Evitas inyeccion de codigo sql

- Puedes usar parametros de salida

- etc.

Aca te paso un link a un articulo muy interesante sobre sql dinamico.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

0 new messages