如果需要在程序中批量执行SQL语句,应该如何操作呢?下文就将教您如何批量执行SQL语句,供您参考。

在项目中,经常会遇到需要批量执行SQL语句的情况,下面将为您示例说明批量执行SQL语句的方法,希望对教您学习SQL语句有所帮助。

批量执行SQL语句的示例(如何批量执行sql语句)  SQL语句 第1张

当然,我们更想在程序中去执行这些语句,而不是再去打开查询分析器。

当我们要在程序中批量执行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操作)

  1. unitBatchSQL;
  2. {
  3. 批量执行SQL脚本
  4. E-main:goldli@163.com
  5. }
  6. interface
  7. uses
  8. SysUtils,ADODB,Classes;
  9. type
  10. TOnException=procedure(constE:Exception)ofobject;
  11. TOnSQLExecute=procedure(conststrSQL:string;constRowsAffected:Integer)ofobject;
  12. type
  13. {完整的SQL语句}
  14. TSQLString=class
  15. private
  16. FBuffer:string;
  17. FSQL:TStrings;
  18. FChanged:Boolean;
  19. functionGetSQL:string;
  20. public
  21. constructorCreate;
  22. destructorDestroy;override;
  23. procedureAppend(constStrSQL:string);
  24. propertySQL:stringreadGetSQL;
  25. end;
  26. TBatchSQL=class
  27. private
  28. FConnection:TADOConnection;
  29. FSQLList:TList;
  30. FOnException:TOnException;
  31. FOnSQLExecute:TOnSQLExecute;
  32. public
  33. constructorCreate(constAConnection:TADOConnection);
  34. destructorDestroy;override;
  35. propertyConnection:TADOConnectionwriteFConnection;
  36. procedureLoadFromFile(constFileName:string);
  37. procedureExecute;
  38. propertyOnException:TOnExceptionwriteFOnException;
  39. propertyOnSQLExecute:TOnSQLExecutewriteFOnSQLExecute;
  40. end;
  41. implementation
  42. {TSQLString}
  43. procedureTSQLString.Append(constStrSQL:string);
  44. begin
  45. FSQL.Append(StrSQL);
  46. FChanged:=True;
  47. end;
  48. constructorTSQLString.Create;
  49. begin
  50. FSQL:=TStringList.Create;
  51. end;
  52. destructorTSQLString.Destroy;
  53. begin
  54. FSQL.Free;
  55. inherited;
  56. end;
  57. functionTSQLString.GetSQL:string;
  58. begin
  59. ifFChangedthen
  60. begin
  61. FBuffer:=FSQL.Text;
  62. FChanged:=False;
  63. end;
  64. Result:=FBuffer;
  65. end;
  66. {TBatchSQL}
  67. constructorTBatchSQL.Create(constAConnection:TADOConnection);
  68. begin
  69. ifAssigned(AConnection)then
  70. FConnection:=AConnection;
  71. FSQLList:=TList.Create;
  72. end;
  73. destructorTBatchSQL.Destroy;
  74. var
  75. i:Integer;
  76. begin
  77. FConnection:=nil;
  78. fori:=FSQLList.Count-1downto0do
  79. TSQLString(FSQLList.Items[i]).Free;
  80. FSQLList.Free;
  81. inherited;
  82. end;
  83. procedureTBatchSQL.Execute;
  84. var
  85. i:Integer;
  86. Qry:TADOQuery;
  87. SQLString:TSQLString;
  88. begin
  89. Assert(Assigned(FConnection),'数据库连接不能为nil.');
  90. Assert(FSQLList.count>0,'请先加载SQL文件.');
  91. FConnection.LoginPrompt:=False;
  92. FConnection.Connected:=True;
  93. Qry:=TADOQuery.Create(nil);
  94. withQrydo
  95. begin
  96. Connection:=FConnection;
  97. Prepared:=True;
  98. fori:=0toFSQLList.Count-1do
  99. begin
  100. SQLString:=TSQLString(FSQLList.Items[i]);
  101. SQL.Clear;
  102. SQL.Add(SQLString.SQL);
  103. try
  104. ExecSQL;
  105. ifAssigned(FOnSQLExecute)then
  106. FOnSQLExecute(SQLString.SQL,RowsAffected);
  107. except
  108. onE:Exceptiondo
  109. ifAssigned(FOnException)then
  110. FOnException(E)
  111. else
  112. raiseException.Create('SQL语句出错:'+sLineBreak+SQLString.SQL);
  113. end;
  114. end;
  115. Free;
  116. end;
  117. end;
  118. procedureTBatchSQL.LoadFromFile(constFileName:string);
  119. var
  120. SqlStr,Tmp:string;
  121. F:TextFile;
  122. SQLString:TSQLString;
  123. begin
  124. Assert(FileExists(FileName),'SQL文件不存在,不能加载.');
  125. AssignFile(F,FileName);
  126. Reset(f);
  127. Repeat
  128. Readln(F,Tmp);
  129. ifTmp='GO'then
  130. begin
  131. SQLString:=TSQLString.Create;
  132. SQLString.Append(SqlStr);
  133. FSQLList.Add(SQLString);
  134. SqlStr:='';
  135. Tmp:='';
  136. end;
  137. SqlStrSqlStr:=SqlStr+Tmp;
  138. Untileof(F);
  139. Closefile(F);
  140. end;
  141. end.

【编辑推荐】

修改SQL主键约束的SQL语句写法

教您使用SQL语句修改SQL主键

逐条更新数据的SQL语句写法

对存储过程代替SQL语句的讨论

测试SQL语句执行时间的方法

转载请说明出处
知优网 » 批量执行SQL语句的示例(如何批量执行sql语句)

发表评论

您需要后才能发表评论