Clausula IN

10/08/2005 - 15:39 por Juan Antonio | Informe spam
Hola a todos estoy intentando hace un procedimiento para que me devuelva un
resultado, la idea es poner un parametro para realizar el filtro y el filtro
montarlo con una clausula IN

Ej.

declare @filtro varchar(1000)

select codigo, nombre
from clientes
where tipo in (@filtro)


Bueno esa es la intención que tengo pero no funciona, despues de estudiar un
poco el tema creo que es dificil que funcione pero bueno quizás hay alguien
que ha resuelto este tema de otra forma


Gracias a todos, Juan Antonio.
 

Leer las respuestas

#1 Alejandro Mesa
10/08/2005 - 15:59 | Informe spam
Juan Antonio,

La manera mas elegante de hacer esto, es rompiendo la cadena y tratar sus
elementos como si fuesen una tabla. Existen varias formas de simular arreglos
en t-sql, desde pasar la lista en un documento xml hasta usar una tabla
auxiliar de numeros. Esta ultima ofrece un gran rendimiento. Voy a adjuntar
un articulo extupendo, escrito por Erland Sommarskog (SQL Server MVP) y un
pequeño ejemplo basado en una funcion del articulo que hace uso de una tabla
auxiliar de numeros.

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html

Ejemplo:

SELECT TOP 8000
Number = IDENTITY(int, 1, 1)
INTO
dbo.Numbers
FROM
pubs..authors t1, pubs..authors t2, pubs..authors t3
go

CREATE FUNCTION inline_split_me (@param varchar(7998)) RETURNS TABLE AS
RETURN(
SELECT
substring(',' + @param + ',', Number + 1,
charindex(',', ',' + @param + ',', Number + 1) - Number - 1) AS Value
FROM
dbo.Numbers
WHERE
Number <= len(',' + @param + ',') - 1
AND substring(',' + @param + ',', Number, 1) = ','
)
go

create table dbo.t1 (
codigo int not null identity unique,
nombre varchar(50) not null,
tipo char(1) not null check(tipo in ('a', 'b', 'c', 'd', 'e', 'f'))
)
go

insert into dbo.t1(nombre, tipo) values('microsoft', 'a')
insert into dbo.t1(nombre, tipo) values('oracle', 'b')
insert into dbo.t1(nombre, tipo) values('mysql', 'c')
insert into dbo.t1(nombre, tipo) values('db2', 'd')
insert into dbo.t1(nombre, tipo) values('filemaker', 'e')
insert into dbo.t1(nombre, tipo) values('dbase', 'f')
insert into dbo.t1(nombre, tipo) values('clipper', 'a')
go

declare @tipo varchar(25)

set @tipo = 'a,b,d'

select
*
from
dbo.t1
inner join
dbo.inline_split_me(@tipo) as t2
on t1.tipo = t2.Value
go

drop function inline_split_me
go

drop table dbo.t1, dbo.Numbers
go


AMB


"Juan Antonio" wrote:

Hola a todos estoy intentando hace un procedimiento para que me devuelva un
resultado, la idea es poner un parametro para realizar el filtro y el filtro
montarlo con una clausula IN

Ej.

declare @filtro varchar(1000)

select codigo, nombre
from clientes
where tipo in (@filtro)


Bueno esa es la intención que tengo pero no funciona, despues de estudiar un
poco el tema creo que es dificil que funcione pero bueno quizás hay alguien
que ha resuelto este tema de otra forma


Gracias a todos, Juan Antonio.




Preguntas similares