sábado, 16 de março de 2013

SQL Server 2000 - Stored Procedure com parâmetro para IN

Em alguns momentos em nossa jornada de trabalho podemos precisar criar uma Stored Procedure no qual precisamos passar como parâmetro de entrada um conjunto de dados (para a clausula IN da Query) com a finalidade de realizar o filtro dos dados. O trecho de código abaixo foi construido para ser executado sem a necessidade de criação de objetos, mantendo a lógica, basta criar a Stored Procedure de acordo com a necessidade e usando as tabelas reais.
Basta copiar, colar e executar.

-----------------------------------------------------------------------
--Criamos uma tabela populada para montar nosso exemplo 
-----------------------------------------------------------------------
DECLARE @TABELA TABLE(ID INT, DESCRICAO VARCHAR(100))
INSERT INTO @TABELA
      SELECT  1, 'UM'       UNION SELECT  2, 'DOIS'     
UNION SELECT  3, 'TRÊS'     UNION SELECT  4, 'QUATRO'   
UNION SELECT  5, 'CINCO'    UNION SELECT  6, 'SEIS'     
UNION SELECT  7, 'SETE'     UNION SELECT  8, 'OITO'     
UNION SELECT  9, 'NOVE'     UNION SELECT 10, 'DEZ'
-----------------------------------------------------------------------

DECLARE @SEPARADOR CHAR(1)           --Parâmetro de Entrada
DECLARE @DADOS     VARCHAR(8000)     --Parâmetro de Entrada

DECLARE @VALOR     VARCHAR(8000)
DECLARE @TABELA_IN TABLE (VALOR VARCHAR(8000))

--Exemplo de dados nos parâmetros de entrada
SET @SEPARADOR = ','
SET @DADOS     = 'UM,TRÊS,CINCO,SETE,NOVE'


SET @DADOS     = @DADOS + @SEPARADOR

--Percorrendo @DADOS para gravar os Itens na tabela temporária buscando
--por meio do @SEPARADOR.
WHILE LEN(@DADOS) > 0
BEGIN
   SET @VALOR = 
        LTRIM(SUBSTRING(@DADOS, 1, CHARINDEX(@SEPARADOR, @DADOS) - 1))
   SET @DADOS = 
        SUBSTRING(@DADOS, CHARINDEX(@SEPARADOR, @DADOS) + 1, LEN(@DADOS))

   INSERT INTO @TABELA_IN (VALOR) VALUES (@VALOR)
END

--Realizando a consulta desejada
SELECT T.ID, T.DESCRICAO
  FROM @TABELA T  
 WHERE T.DESCRICAO IN (SELECT VALOR FROM @TABELA_IN)

-----------------------------------------------------------------------

Nenhum comentário:

Postar um comentário