Desenvolvimento - Delphi

Tabelas temporárias do MS SQL Server no Delphi

Veja alguns exemplos de criação e manipulação de tabelas temporárias do SQL Server no Delphi.

por Active Delphi



Autor: Oswaldo Ricardo da Rocha Junior é autodidata em informática, trabalha com desenvolvimento de software e análise de sistemas há mais de 20 anos, e atualmente é aluno de graduação do curso de Sistemas de Informação da FAFRAM - Ituverava.

O uso de tabelas temporárias do MS SQL Server no Delphi é muito simples.
Antes, gostaria de informar que:
- Toda tabela temporária é criada no banco TempDB.
- Ao criarmos uma tabela temporária, temos que considerar a visibilidade da mesma.

Uma tabela temporária é criada quando o seu nome inicia com # ou ##.
# significa que a tabela criada é vista apenas pela conexão corrente ao banco, ou seja, se existir duas ou mais conexões com o banco, apenas a conexão que criou a tabela temporária consegue ve-la, ela não existe para as outras conexões. Isto quer dizer tambem que em cada conexão aberta pode existir uma tabela temporária com o mesmo nome, mas ela pode ter campos diferentes e quantidades diferentes de registros. pois é exclusiva da conexão que a gerou.
Para apagar este tipo de tabela temporária você deve:
executar um Drop Table dentro da conexão que a criou;
ou
fechar a conexão onde a tabela temporária foi criada.

## significa que a tabela criada é vista por todas as conexões ao banco, ou seja, ela pode ser vista e sofrer alterações em conexões diferentes daquela que a originou.
Para apagar este tipo de tabela temporária você deve:
executar um Drop Table dentro de qualquer conexão;
ou
fechar a conexão onde a tabela temporária foi criada.

No Delphi eu recomendo o uso os componentes ADO para trabalhar com o SQL Server, portanto, a conexão com o banco de dados é efetuada pelo uso do componente TADOConnection.
Para trabalhar com tabelas temporárias iniciadas com # é importante que todos os componentes derivados de TADODataSet tenham suas propriedades Connection apontadas para o mesmo TADOConnection, pois assim fica garantida que a mesma conexão está sendo utilizada por todos os DataSets. Caso esteja utilizando o BDE, o componente de conexão ao banco deve ser o TDatabase.
Para tabelas iniciadas com ##, o único cuidado a ser tomado é garantir que a conexão onde foram criadas as tabelas seja a última a ser fechada, senão as tabelas serão dropadas automaticamente, e qualquer outra conexão aberta que esteja utilizando as mesmas retornará erro.

Exemplos de criação e manipulação no Delphi:
// Criação de uma tabela temporária via comando CREATE TABLE
qryTabTemp.Close;
qryTabTemp.SQL.Clear;
qryTabTemp.SQL.Add("if object_id(""tempdb..#TabTemp"") is not null " +
" drop table #TabTemp " +
"Create Table #TabTemp (Codigo Integer Not Null , " +
" Descricao varchar(50) Not Null , " +
" Quantidade Numeric(12,2) , " +
" Valor Money, " +
" Obs Varchar(512) ) " );
qryTabTemp.ExecSQL;


// Criação de uma tabela temporária via cláusula INTO do SELECT
qryTabTemp.Close;
qryTabTemp.SQL.Clear;
qryTabTemp.SQL.Add("if object_id(""tempdb..#TabTemp"") is not null " +
" drop table #TabTemp " +
"Select (case when r.CODEAN is Null " +
" then ""0000000""+substring(p.CODPRO,1,5)+substring(p.CODPRO,7,1) " +
" else r.CODEAN end) as CODEAN, " +
" p.CODPRO, " +
" p.NOMPRO, " +
" p.UNIDADE, " +
" p.SECAO, " +
" s.DESCRICAO " +
" into #TabTemp " +
" from CADPROD p " +
" left join CadRef r on p.CODPRO = r.CODPRO " +
" left join CADSEC s on s.CODIGO = p.SECAO " +
" order by r.CODEAN,p.CODPRO " );
qryTabTemp.ExecSQL;


// Visualização I
// Tabela temporária via comando SELECT
qryTabTemp.Close;
qryTabTemp.SQL.Clear;
qryTabTemp.SQL.Add("Select * " +
" From #TabTemp " +
" order by Descricao " );
qryTabTemp.Open;


// Visualização II
// Tabela temporária via cláusula Join do comando SELECT
qryLocal_Produtos.Close;
qryLocal_Produtos.SQL.Clear;
qryLocal_Produtos.SQL.Add("Select lp.codloj, " +
" l.Nomloj, " +
" lp.CodQuadra, " +
" q.Descricao as NomQuadra, " +
" lp.CodSetor, " +
" s.Descricao as NomSetor, " +
" lp.CodRua, " +
" r.Descricao as NomRua, " +
" re.CODEAN, " +
" re.CODPRO, " +
" re.NOMPRO, " +
" re.UNIDADE, " +
" re.SECAO, " +
" re.DESCRICAO " +
" from Local_Produtos lp " +
" left join Cadloja l on l.codloj = lp.codloj " +
" left join Quadras q on q.codloj = lp.codloj and " +
" q.codQuadra = lp.codQuadra " +
" left join Quadras_Setores s on s.codloj = lp.codloj and " +
" s.codQuadra = lp.codQuadra and " +
" s.codSetor = lp.codSetor " +
" left join Quadras_Setores_Ruas r on r.codloj = lp.codloj and " +
" r.codQuadra = lp.codQuadra and " +
" r.codSetor = lp.codSetor and " +
" r.codRua = lp.codRua " +
" left join #TabTemp re on re.CODEAN = lp.codref " +
" where lp.codloj = :Loja and " +
" lp.codquadra = :Quadra and " +
" lp.codsetor = :setor and " +
" lp.codrua = :rua and " +
" re.Secao = :secao " +
" order by lp.codloj, " +
" lp.CodQuadra, " +
" lp.CodSetor, " +
" lp.CodRua, " +
" lp.Ordem ");

qryLocal_Produtos.Parameters.ParamByName("Loja").Value := cdsLocacao.FieldByName("codloj").asInteger;
qryLocal_Produtos.Parameters.ParamByName("Quadra").Value := cdsLocacao.FieldByName("codQuadra").asString;
qryLocal_Produtos.Parameters.ParamByName("Setor").Value := cdsLocacao.FieldByName("codSetor").asString;
qryLocal_Produtos.Parameters.ParamByName("Rua").Value := cdsLocacao.FieldByName("codRua").asString;
qryLocal_Produtos.Parameters.ParamByName("Secao").Value := cdsLocacao.FieldByName("codSecao").asString;

qryLocal_Produtos.Open;

Active Delphi

Active Delphi - Assine a revista:
http://www.activedelphi.com.br/parceiro_revista.php?parceiro=5