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.

Preguntas similare

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.




Respuesta Responder a este mensaje
#2 Juan Antonio
24/08/2005 - 11:53 | Informe spam
Muchas gracias por esta información tan completa.

Salu2, Juan Antonio.


"Alejandro Mesa" escribió en el
mensaje news:
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.
>
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida