Pesquisando o mesmo registro em diversas tabelas no SQL Server 2008, R2 e 2012.

Dica – Pesquisando o mesmo registro em diversas tabelas no SQL Server 2008, R2 e 2012.

Anúncios

Pessoal, bom dia.

Gostaria de lançar uma pergunta para vocês.

Quem nunca teve a necessidade de pesquisar a mesa informação em mais de uma tabela no Banco de Dados, mais especificamente no Microsoft SQL Server?

Pois bem, é justamente a resposta para este questionamento que é um dos mais comuns nos fóruns, listas de usuários e até mesmo dentro da sua empresa, que esta dica pretende responder.

Como todos sabem, um simples Banco de Dados é organizado logicamente por uma estrutura de armazenamento de dados chamada Tabela. Este estrutura é dividida de forma lógica e física em pequenas áreas de armazenamento chamadas colunas.

Seguindo este conceito, podemos imaginar a dificuldade para qualquer Administrador de Banco de Dados, Analista de Sistemas, Desenvolvedor ou qualquer outro profissional da área de TI, BI ou Tomada de Decisão tem a dificuldade para se encontrar o mesmo dado espalhado por estas estruturas de armazenamento.

Com base nesta necessidade, e também respondendo a diversos questionamentos que venho sempre recebendo em meus e-mails, posts que respondo diariamente nos Fóruns MSDN. Como não sempre, sabemos por onde começar pesquisei um pouco de informações na Internet e acredito ter consegui desenvolver uma possível solução ou ideia de solução para este cenário.

A possível solução:

Conforme destaquei anteriormente, desenvolvi uma possível solução para este cenário, denominada “Mecanismo de Pesquisa de Dados em Objetos”. O código utilizado por esta funcionalidade esta dividido em sete partes para facilitar o entendimento e criação deste mecanismo de pesquisa.

Parte 1 – Considerada o ponto inicial da criação do Mecanismo, bastante simples e de fácil compreensão. Trata-se da Criação das Tabelas que serão utilizadas como repositório para os dados.

— Parte 1: Verificando a existência das Tabelas —

If Exists(Select Object_Id(‘Tabela1’))

 Begin

  Drop Table Tabela1

 

  CREATE TABLE Tabela1

   (Coluna1 INT,

    Coluna2 INT,

    Coluna3 INT)

 End

 Else

  Begin

   CREATE TABLE Tabela1

    (Coluna1 INT,

     Coluna2 INT,

     Coluna3 INT)

  End 

 

If Exists(Select Object_Id(‘Tabela2’))

 Begin

  Drop Table Tabela2

 

  CREATE TABLE Tabela2

   (Coluna1 INT,

    Coluna2 INT,

    Coluna3 INT)

 End

 Else

  Begin

   CREATE TABLE Tabela2

    (Coluna1 INT,

     Coluna2 INT,

     Coluna3 INT)

  End  

 

If Exists(Select Object_Id(‘Tabela3’))

 Begin

  Drop Table Tabela3

 

  CREATE TABLE Tabela3

   (Coluna1 INT,

    Coluna2 INT,

    Coluna3 INT)

 End

  Else

  Begin

   CREATE TABLE Tabela3

    (Coluna1 INT,

     Coluna2 INT,

     Coluna3 INT)

  End

Parte 2 – Responsável pela população de dados, para tabelas criadas anteriormente:

— Parte 2: Inserindo os registros —

INSERT INTO Tabela1 VALUES (1, 2, 3)

INSERT INTO Tabela1 VALUES (0, 7, 9)

INSERT INTO Tabela1 VALUES (3, 4, 2)

 

INSERT INTO Tabela2 VALUES (2, 2, 2)

INSERT INTO Tabela2 VALUES (3, 9, 5)

INSERT INTO Tabela2 VALUES (1, 6, 8)

 

INSERT INTO Tabela3 VALUES (4, 0, 7)

INSERT INTO Tabela3 VALUES (6, 5, 1)

INSERT INTO Tabela3 VALUES (4, 7, 9)

Parte 3 – Relaciona-se a declaração de variáveis, utilizadas como parâmetros de entrada de valores como forma de inteligência para o Mecanismo de Pesquisa de dados. Mas não é somente isso que esta parte do código faz, existe um ponto importante relacionado à variável @ValordePesquisa, esta variável é o elemento definido na estrutura do código responsável em receber o valor que será pesquisado.

— Parte 3: Declarando as variáveis —

DECLARE @Comando VARCHAR(1000),

                @ComandoTransact VARCHAR(100),

                @ValordePesquisa INT,

                @TABLE_NAME VARCHAR(20),

                @Coluna_NAME VARCHAR(20)

 

Set @Comando = ”

Set @TABLE_NAME = ”

Set @Coluna_NAME = ”

 

Set @ComandoTransact = ‘SELECT ”?”, ”^”, COUNT(*) AS TOTAL FROM ? WHERE ^ = @ UNION ALL’ + CHAR(10)

 

Set @ValordePesquisa = 3 — Informe o valor a ser pesquisado dentro do Mecanismo.

Parte 4 –  Começamos a montar a estrutura responsável em pesquisar dos dados, com base, nas tabelas e colunas existentes em nosso ambiente. Fazemos a declaração de uma variável do tipo Cursor. Sendo este cursor, declarado com a opção Fast_forward, habilitando os otimizadores de desempenho existentes no SQL Server, visando otimizar a pesquisa de dados e também o armazenamento dos mesmos nas variáveis vinculadas ao Cursor.

— Parte 4: Declarando o CursordePesquisa para retornar o nome da tabela e nome da Coluna —

DECLARE CursordePesquisa CURSOR FAST_FORWARD

FOR SELECT TABLE_NAME,

COLUMN_NAME

FROM INFORMATION_SCHEMA.COLUMNS

 

— Abrindo o CursordePesquisa —

OPEN CursordePesquisa FETCH NEXT FROM CursordePesquisa

INTO @TABLE_NAME, @Coluna_NAME

Parte 5 – Iniciamos o bloco condicional While, elemento importante no nosso ambiente, responsável em montar a estrutura de execução do Select armazenado na variável @Comando, fazendo um busca do nome das tabelas e suas respectivas colunas através das variáveis @TableName e @ColunaName, vinculadas ao CursordePesquisa, contendo os valores encontrados na execução de cada registro encontrado pelo Cursor.

— Parte 5: Iniciando o bloco condicional While —

WHILE @@FETCH_STATUS = 0

 BEGIN

  SET @Comando = @Comando + REPLACE(REPLACE(REPLACE(@ComandoTransact,’?’,@TABLE_NAME),’^’,@Coluna_NAME),’@’,@ValordePesquisa)

  FETCH NEXT FROM CursordePesquisa

  INTO @TABLE_NAME, @Coluna_NAME

 END

Parte 6 – Pode ser considerada uma das mais importantes para o funcionamento do Mecanismo de pesquisa. Ela tem como finalidade realizar a concatenação e União dos Selects conforme os mesmos vão sendo montados durante a execução do CursordePesquisa e do Bloco Condicional While.

— Parte 6: Realizando a Concatenação e União dos Selects —

SET @Comando = LEFT(@Comando,LEN(@Comando)-LEN(‘UNIONALL’)-2)

Parte 7 – Consiste na parte final do código, responsável em criar a Tabela Temporária #Resultados, utilizada para armazenar o resultado dos dados encontrados pelo CursordePesquisa. Nas parte do código, realizamos a inserção dos dados nesta tabela temporário através do comando Insert tendo como parâmetro para entrada de valores o comando Exec (@comando), fazendo a execução da variável @Comando, contendo em sua estrutura as Partes 4, 5 e 6 do Mecanismo de Pesquisa dos Dados.

— Parte 7: Criando a Tabela Temporária para armazenar os Resultados —

CREATE TABLE #Resultados

 (NomeTabela Varchar(20),

  NomeColuna VARCHAR(20),

  TotaldeRegistros INT)

 

— Inserindo os dados na tabela Resultados com base na execução do @Comando —

INSERT INTO #Resultados

Exec (@Comando)

 

— Encerrando o Cursor —

CLOSE CursordePesquisa

DEALLOCATE CursordePesquisa

 

— Apresentando os dados —

SELECT * FROM #Resultados

 

— Excluíndo a Tabela Temporária Resultados —

DROP TABLE #Resultados

A final da execução do nosso Mecanismo de Pesquisa de Dados em Objetos, temos o resultado apresentado na Figura 1:

Figura 1 – Resultado da pesquisa de dados, com base no valor informado na variável @ValordePesquisa.

Bom galera, é isso, chegamos ao final de mais dica, acredito que através deste código, muitos questionamentos, dúvidas e até mesmo dificuldades foram respondidas.

Espero que todos tenham gostado.

Nos encontramos em breve.

Até mais.

 

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP - Faculdade de Informática e Administração Paulista de São Paulo. Pós-Graduado em Gestão da Tecnologia da Informação Faculdade - ESAMC Sorocaba. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1995 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator - Administrador de Banco de Dados - SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, Triggers. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping. Atualmente trabalho como Administrador de Banco de Dados no FIT - Instituto de Tecnologia da Flextronics, como também, Consultor em Projetos de Tunnig e Performance para clientes, bem como, Professor Titular na Fatec São Roque. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Possuo titulação Oficial Microsoft MVP - SQL Server renovada desde 2007.

Um comentário em “Pesquisando o mesmo registro em diversas tabelas no SQL Server 2008, R2 e 2012.”

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s