Executar comando SQL em lote - DELPHI
Pessoal, estou tentando executar um arquivo SQL porém ele dar erro ao ser executado. Parece ser erro de sintaxe.
Na verdade eu gostaria de executar todo o script de uma só vez. Tentei usar o IBScript mas não estou conseguindo. Então foi criado uma rotina onde leio o arquivo e vou executando cada linha de comando.
Os três primeiros comandos do arquivo sql são:
set term ^;
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
.
Porém ele da o seguinte erro:
Segue o código:
Será que essa paleta não aceita esse tipo de comando?
Na verdade eu gostaria de executar todo o script de uma só vez. Tentei usar o IBScript mas não estou conseguindo. Então foi criado uma rotina onde leio o arquivo e vou executando cada linha de comando.
Os três primeiros comandos do arquivo sql são:
set term ^;
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
Porém ele da o seguinte erro:
Token Unknown - line 1, column 5 term
Segue o código:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WiniNet, Data.DBXFirebird, Data.FMTBcd, Data.DB,
IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP,
Vcl.Buttons, Vcl.ComCtrls, IdException, IniFiles, ShellAPI,
Vcl.Samples.Gauges, System.Zip, System.UITypes,
Data.SqlExpr, IdHTTP,
IdAntiFreezeBase, Vcl.IdAntiFreeze, DBXCommon, IBX.IBScript;
type
TForm1 = class(TForm)
SQLConnection1: TSQLConnection;
SQLQuery1: TSQLQuery;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure atualiza;
procedure grava;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.atualiza;
var
F: TextFile;
buffer: string;
begin
AssignFile(F, 'C:\\SAPO\\scripts\\atualizadofinal.sql');
Reset(F);
Readln(F, buffer);
while not eof(F) do
begin
with SQLQuery1 do
begin
// buffer := StringReplace(buffer, '^', EmptyStr, [rfReplaceAll]); LINHA COMENTADA
Active := False;
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(buffer);
grava;
end;
Readln(F, buffer);
end;
CloseFile(F);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
atualiza;
end;
procedure TForm1.grava;
var
Trans: TDBXTransaction;
begin
Trans := SQLConnection1.BeginTransaction(TDBXIsolations.ReadCommitted);
try
SQLQuery1.ExecSQL;
SQLConnection1.CommitFreeAndNil(Trans);
except
on E: Exception do
begin
SQLConnection1.RollbackFreeAndNil(Trans);
MessageDlg('Erro Ao Executar Script!' +
E.Message, mtError, [mbOK], 0);
end;
end;
end;
End.
Será que essa paleta não aceita esse tipo de comando?
Cayque
Curtidas 0
Melhor post
Luiz Vichiatto
15/01/2018
Cayque, o arquivo tem que ser executado todo, não linha a linha.
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC
GOSTEI 1
Mais Respostas
Cayque
15/01/2018
Cayque, o arquivo tem que ser executado todo, não linha a linha.
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC
Certo. O acento circunflexo consigo remover tranquilo. Posso carregar todo o arquivo SQL e jogar dentro de uma StringList. Mas e depois, como eu faria pra carregar todo o arquivo SQL na SqlQuery sem executar um por um? Saberia me explicar ?
Obrigado
GOSTEI 0
Stewart Moura
15/01/2018
Cayque, o arquivo tem que ser executado todo, não linha a linha.
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC
Removi o "set term ^" e o "^" porém ta dando erro agora no "ALTER". Estranho que ele não está reconhecendo nenhum comando praticamente.
Token Unknown - line 2, column 1 ALTER
GOSTEI 1
Stewart Moura
15/01/2018
Percebi que quando eu deixei somente uma linha de comando (ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER;), é executado normalmente. Se eu deixar mais de uma linha já dar erro. Sinal que ele não está entendendo que é para parar no ponto e virgula e que ele executa linha por linha.
Consegui executar os comando só fazendo a rotina porém quando chega nessa linha
Diz que a string foi mal formada.
O ruim disso tudo que executando direto pelo IBExpress funciona perfeitamente.
Consegui executar os comando só fazendo a rotina porém quando chega nessa linha
COMMENT ON DOMAIN BANDEIRA IS 'Bandeiras de Cartão: Visa, Master, Amex, Hipercard,Diners Club, Aura, SoroCred, Discover, Cabal, Elo';
Diz que a string foi mal formada.
O ruim disso tudo que executando direto pelo IBExpress funciona perfeitamente.
GOSTEI 0