Fórum Identificar código SQL #459142
22/10/2013
0
Preciso identificar se o código é inclusão de tabelas ou colunas para então realizar os tratamentos adequados.
Tenho as seguintes linhas de código SQL:
ALTER TABLE tblContaCorrente ADD COLUMN ccorrente_tpinscricao integer; CREATE TABLE tblFinCCusto (finccustoID AutoIncrement, finccusto_contaspagarID integer, finccusto_filialID integer, finccusto_CenCustoID integer, finccusto_CenResultadoID integer, finccusto_valor Currency, finccusto_tipo VarChar(2), finccusto_userID integer, finccusto_alt DateTime, finccusto_cad DateTime, finccusto_status YESNO, PRIMARY KEY (finccustoID));
Ao executar cada linha, preciso identificar se é ALTER TABLE ou CREATE TABLE para que eu possa fazer a validação;
Caso seja CREATE TABLE, preciso capturar o nome da tabela.
Caso seja ALTER TABLE, preciso capturar o nome da coluna.
Paulo Andrade
Curtir tópico
+ 0Posts
22/10/2013
Thiago Irrazabal
Usando Copy e Pos não te ajuda?
if Pos('ALTER', S) > 0 then
begin
S := Copy(S, Pos('COLUMN', S) + 7, 32);
S := Copy(S, 1, Pos(' ', S) - 1);
end
else if Pos('CREATE', S) > 0 then
begin
S := Copy(S, Pos('TABLE', S) + 6, 32);
S := Copy(S, 1, Pos(' ', S) -1);
end;
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
22/10/2013
Paulo Andrade
function CreateOuAlter(Instrucao: String): String;
var
resultou,texto: string;
i,j,x: integer;
begin
result := '';
if POS('CREATE TABLE',instrucao)>0 then
result := 'CREATE TABLE'
else
if POS('ALTER TABLE',instrucao)>0 then
result := 'ALTER TABLE'
else
result := 'ERRO';
end;
Mas na hora de identificar qual o nome da Coluna a ser criada não deu certo:
function IdentificaColuna(Instrucao: String): String;
var
texto,texto2: string;
i,j,x: integer;
begin
result := '';
if POS('ALTER TABLE ',instrucao)>0 then
begin
i := Length(instrucao);
j := POS(' ADD COLUMN ',instrucao);
texto := COPY(instrucao,i-j,j);
x := POS(' ',texto);
texto2 := COPY(texto,1,x-1);
result := texto2;
end;
end;
Com algumas linhas da certo, com outras não.
Com essa linha:
ALTER TABLE tblProdutos ADD COLUMN produto_filialID Integer
Ele retorna correto, a coluna produto_filialID.
Mas com essa linha:
ALTER TABLE tblConfig ADD COLUMN config_pdv_TpMovID Integer;
Ele retorna errado: ig_pdv_TpMovID
O que será que estou informando errado?
Gostei + 0
22/10/2013
Thiago Irrazabal
function CreateOuAlter(Instrucao: String): String;
var
resultou,texto: string;
i,j,x: integer;
begin
result := '';
if POS('CREATE TABLE',instrucao)>0 then
result := 'CREATE TABLE'
else
if POS('ALTER TABLE',instrucao)>0 then
result := 'ALTER TABLE'
else
result := 'ERRO';
end;
Mas na hora de identificar qual o nome da Coluna a ser criada não deu certo:
function IdentificaColuna(Instrucao: String): String;
var
texto,texto2: string;
i,j,x: integer;
begin
result := '';
if POS('ALTER TABLE ',instrucao)>0 then
begin
i := Length(instrucao);
j := POS(' ADD COLUMN ',instrucao);
texto := COPY(instrucao,i-j,j);
x := POS(' ',texto);
texto2 := COPY(texto,1,x-1);
result := texto2;
end;
end;
Com algumas linhas da certo, com outras não.
Com essa linha:
ALTER TABLE tblProdutos ADD COLUMN produto_filialID Integer
Ele retorna correto, a coluna produto_filialID.
Mas com essa linha:
ALTER TABLE tblConfig ADD COLUMN config_pdv_TpMovID Integer;
Ele retorna errado: ig_pdv_TpMovID
O que será que estou informando errado?
function IdentificaColuna(Instrucao: String): String;
var
texto,texto2: string;
i,j,x: integer;
begin
result := '''';
if POS(''ALTER TABLE '',instrucao)>0 then
begin
i := Length(instrucao);
j := POS('' ADD COLUMN '',instrucao);
texto := COPY(instrucao,i-j,j);
x := POS('' '',texto);
texto2 := COPY(texto,1,x-1);
result := texto2;
end;
end;
Tenta trocar essa tua linha
texto := COPY(instrucao,i-j,j);
por esta
texto := COPY(instrucao,j - 12,j);
não testei nem nada, mas acho que funciona, to sem tempo agora de testar, mas testa aí, abraço.
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
23/10/2013
Paulo Andrade
function IdentificaColuna(Instrucao: String): String;
var
s: string;
begin
result := '';
if POS('ALTER TABLE ',instrucao)>0 then
begin
S := instrucao;
S := Copy(S, Pos('COLUMN', S) + 7, 32);
S := Copy(S, 1, Pos(' ', S) - 1);
result := S;
end;
end;
Só gostaria de esclarecer 2 dúvidas, o número 7 e o 32?
Gostei + 0
23/10/2013
Thiago Irrazabal
function IdentificaColuna(Instrucao: String): String;
var
s: string;
begin
result := '';
if POS('ALTER TABLE ',instrucao)>0 then
begin
S := instrucao;
S := Copy(S, Pos('COLUMN', S) + 7, 32);
S := Copy(S, 1, Pos(' ', S) - 1);
result := S;
end;
end;
Só gostaria de esclarecer 2 dúvidas, o número 7 e o 32?
Bom dia,
o numero 7 seria o numero de caracteres depois do "COLUMN"... COLUMN tem 6 caracteres + o espaço que vem depois dele... o 32 eu me baseei no numero de caracteres que pode ter uma coluna no FIREBIRD, não sei qual banco tu ta usando mas, no firebird as colunas podem ter no máximo 32 então, sabendo que depois dos 7 caracteres que o POS acha com a palavra COLUMN, ele pega os 32 caracteres depois disso... o segundo Copy com o POS(' ',S) - 1 eu fiz porque não necessariamente tua coluna terá 32 caracteres.
Abraço, qualquer dúvida só chamar.
Att,
Thiago Irrazabal de Oliveira
Gostei + 0
23/10/2013
Thiago Irrazabal
if Pos('ALTER', S) > 0 then
begin
S := Copy(S, Pos('COLUMN', S) + 6, 32);
while Pos(' ', S[1]) <> 0 do
S := Copy(S, Pos(' ', S) + 1, 32);
S := Copy(S, 1, Pos(' ', S) - 1);
end;
Pq eu fiz assim? pq antes com aquele Pos('COLUMN', S) + 7 eu pega o COLUMN mais o espaço que tinha depois mas, pode ser que na tua condição tenha mais de 1 espaço depois do COLUMN.
Explicando:
O + 6 ali é para tirar fora a palavra "COLUMN", o WHILE ele testa se o primeiro carácter é espaço se for ele tira fora, depois que tirou todos os espaços ele pega o nome da coluna até o próximo espaço...
Abraço.
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
23/10/2013
Deivison Melo
Veja se ele atenderá você!
Pelo que vi você está precisando de algo dessa natureza!
Abração e bons códigos!
Gostei + 0
24/10/2013
Paulo Andrade
Não Deivison, é exatamente como o Thiago Irrazabal explicou. A solução ficou perfeita com o banco Access que estou usando, muito obrigado.
Se alguém precisar dos códigos que fiz para atualizar meu banco Access, posso disponibilizar as funções.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)