如果需要在程序中批量执行SQL语句,应该如何操作呢?下文就将教您如何批量执行SQL语句,供您参考。
在项目中,经常会遇到需要批量执行SQL语句的情况,下面将为您示例说明批量执行SQL语句的方法,希望对教您学习SQL语句有所帮助。
当然,我们更想在程序中去执行这些语句,而不是再去打开查询分析器。
当我们要在程序中批量执行SQL语句时,需要明白AdoConnection,或AdoQuery(假设我们使用ADO组件)可以执行的语句有什么要求。
1、在查询分析器里,一条SQL语句,我们可以直接写成
Select * from aTable where ID=123
或者
Select * from aTable where ID=123;
这两条语句结果相同。不同的地方只是第二条多了一个“;”,用来表示一条语句结束。
2、在查询分析器里,多条SQL语句的写法
insert into aTable(Field1,Field2) values( '值一','值二')
go
这里的 go 表示一个批处理
根据以上两点,我们可以看出,我们要在程序中批量执行SQL语句,需要判断一个完整的操作包含几条语句,这些语句是不是可以单独执行等。
下面是一个示例程序(程序中不涉及到Select操作)
- unitBatchSQL;
- {
- 批量执行SQL脚本
- E-main:goldli@163.com
- }
- interface
- uses
- SysUtils,ADODB,Classes;
- type
- TOnException=procedure(constE:Exception)ofobject;
- TOnSQLExecute=procedure(conststrSQL:string;constRowsAffected:Integer)ofobject;
- type
- {完整的SQL语句}
- TSQLString=class
- private
- FBuffer:string;
- FSQL:TStrings;
- FChanged:Boolean;
- functionGetSQL:string;
- public
- constructorCreate;
- destructorDestroy;override;
- procedureAppend(constStrSQL:string);
- propertySQL:stringreadGetSQL;
- end;
- TBatchSQL=class
- private
- FConnection:TADOConnection;
- FSQLList:TList;
- FOnException:TOnException;
- FOnSQLExecute:TOnSQLExecute;
- public
- constructorCreate(constAConnection:TADOConnection);
- destructorDestroy;override;
- propertyConnection:TADOConnectionwriteFConnection;
- procedureLoadFromFile(constFileName:string);
- procedureExecute;
- propertyOnException:TOnExceptionwriteFOnException;
- propertyOnSQLExecute:TOnSQLExecutewriteFOnSQLExecute;
- end;
- implementation
- {TSQLString}
- procedureTSQLString.Append(constStrSQL:string);
- begin
- FSQL.Append(StrSQL);
- FChanged:=True;
- end;
- constructorTSQLString.Create;
- begin
- FSQL:=TStringList.Create;
- end;
- destructorTSQLString.Destroy;
- begin
- FSQL.Free;
- inherited;
- end;
- functionTSQLString.GetSQL:string;
- begin
- ifFChangedthen
- begin
- FBuffer:=FSQL.Text;
- FChanged:=False;
- end;
- Result:=FBuffer;
- end;
- {TBatchSQL}
- constructorTBatchSQL.Create(constAConnection:TADOConnection);
- begin
- ifAssigned(AConnection)then
- FConnection:=AConnection;
- FSQLList:=TList.Create;
- end;
- destructorTBatchSQL.Destroy;
- var
- i:Integer;
- begin
- FConnection:=nil;
- fori:=FSQLList.Count-1downto0do
- TSQLString(FSQLList.Items[i]).Free;
- FSQLList.Free;
- inherited;
- end;
- procedureTBatchSQL.Execute;
- var
- i:Integer;
- Qry:TADOQuery;
- SQLString:TSQLString;
- begin
- Assert(Assigned(FConnection),'数据库连接不能为nil.');
- Assert(FSQLList.count>0,'请先加载SQL文件.');
- FConnection.LoginPrompt:=False;
- FConnection.Connected:=True;
- Qry:=TADOQuery.Create(nil);
- withQrydo
- begin
- Connection:=FConnection;
- Prepared:=True;
- fori:=0toFSQLList.Count-1do
- begin
- SQLString:=TSQLString(FSQLList.Items[i]);
- SQL.Clear;
- SQL.Add(SQLString.SQL);
- try
- ExecSQL;
- ifAssigned(FOnSQLExecute)then
- FOnSQLExecute(SQLString.SQL,RowsAffected);
- except
- onE:Exceptiondo
- ifAssigned(FOnException)then
- FOnException(E)
- else
- raiseException.Create('SQL语句出错:'+sLineBreak+SQLString.SQL);
- end;
- end;
- Free;
- end;
- end;
- procedureTBatchSQL.LoadFromFile(constFileName:string);
- var
- SqlStr,Tmp:string;
- F:TextFile;
- SQLString:TSQLString;
- begin
- Assert(FileExists(FileName),'SQL文件不存在,不能加载.');
- AssignFile(F,FileName);
- Reset(f);
- Repeat
- Readln(F,Tmp);
- ifTmp='GO'then
- begin
- SQLString:=TSQLString.Create;
- SQLString.Append(SqlStr);
- FSQLList.Add(SQLString);
- SqlStr:='';
- Tmp:='';
- end;
- SqlStrSqlStr:=SqlStr+Tmp;
- Untileof(F);
- Closefile(F);
- end;
- end.
【编辑推荐】
修改SQL主键约束的SQL语句写法
教您使用SQL语句修改SQL主键
逐条更新数据的SQL语句写法
对存储过程代替SQL语句的讨论
测试SQL语句执行时间的方法
转载请说明出处
知优网 » 批量执行SQL语句的示例(如何批量执行sql语句)
知优网 » 批量执行SQL语句的示例(如何批量执行sql语句)