"Jorge Aguilar" <jaa...@gmail.com> escribió en el mensaje news:e16HLe4U...@TK2MSFTNGP12.phx.gbl...
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