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
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;