09 abril 2013

SQL- Como criar variáveis tipo tabela

Seja bem vindo,

Nesse post vou falar um pouco sobre uma situação onde eu precisei utilizar uma variável do tipo tabela.
Uma variável do tipo tabela é como uma variável do tipo varchar, int, char entre outros, mas com uma diferença nós criamos o tipo que será uma tabela, são utilizadas para armazenamento temporário de dados.

Problema: Precisei passar uma lista de códigos em string dessa forma '1,2,3' para um parâmetro e criar um filtro para que o meu retorno de registros fosse de acordo com eles.

                               

Solução: Criei um Tipo Tabela e depois declarei uma variável desse mesmo tipo na minha procedure.

Para criar o Tipo Tabela gerar o script de acordo com o seu contexto.

CREATE TYPE dbo.GrupoType AS TABLE (       
IDGRUPO INT NOT NULL        
PRIMARY KEY (IDGRUPO) 
) 
GO

Ele será exibido dentro de Tipos de Tabela Definidos pelo Usuário:



Logo após criei a procedure para fazer a chamada.

Declarei a variável  dessa forma: Declare @GrupoPessoa as GrupoType  
A seguir faço um While para inserir os valores do parâmetro @ListaGrupo  nessa variável do tipo tabela de forma que para cada linha seja adicionado um valor.
E por ultimo faço o filtro usando uma subquery com o select da variável tabela já populada.

CREATE PROCEDURE P_RELATORIO   
@LISTAGRUPO as varchar(max)  
  
AS  
DECLARE @GRUPOPESSOA GRUPOType  
DECLARE @RESULTADOGRUPO VARCHAR(MAX)    
  
 ---Insere em uma variável do tipo tabela os valores EX: '1,2,3'  
 -----------------------------------------------    
 IF LEFT(@LISTAGRUPO, 1)<> ','    
  BEGIN    
   SET @LISTAGRUPO = @LISTAGRUPO  + ','    
  END    
 WHILE charindex(',', @LISTAGRUPO)<> 0    
  BEGIN    
   SET @RESULTADOGRUPO  = ltrim(rtrim(substring(@LISTAGRUPO , 1 ,  
    charindex(',', @LISTAGRUPO)- 1)))    
   SET @LISTAGRUPO = ltrim(rtrim(right(@LISTAGRUPO ,  
   len(@LISTAGRUPO )- charindex(',', @LISTAGRUPO))))    
   INSERT INTO  @GRUPOPESSOA(IDGRUPO) VALUES (@RESULTADOGRUPO )    
  END      
-----------------------------------------------------  
--a variável @GRUPOPESSOA foi populada com os valores 1,2,3  
  
SELECT pes_CPF AS CPF,  
    pes_Nome AS NOME,  
    pes_CodigoGrupo AS CODGRUPO  
FROM PessoaFisica   
WHERE (pes_CodigoGrupo IN (SELECT IDGRUPO FROM @GRUPOPESSOA) OR @LISTAGRUPO IS NULL)    
  


Resultado:




Notas:
Aprendi fazer dessa forma, mas descobri que existem outras formas também.
Não consegui utilizar na versão SQL Server 9.0.4053, então atualizei para a versão  SQL Server 10.50.2500.


Nenhum comentário:

Postar um comentário