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.