ADOCommand怎样批量执行sql语句,该怎么解决

ADOCommand怎样批量执行sql语句,该怎么解决,第1张

因为SQL脚本中的Go是单独成行的,所以比较好判断,另外脚本中最好不要含有注释语句,如果注释过长的话会换行,这样要多判断一次。

另外SQL脚本要是Ansi格式,不要生成Unicode的,否则不能正确运行。

C/C++ code

 

 void __fastcall TForm1::Button1Click(TObject Sender)

{

        TStringList  SQL = new TStringList;

        SQL->LoadFromFile(ExtractFilePath(Application->ExeName) + 

"SQLScript");

        ADOCommand1->CommandText = "";

        for(int i = 0; i < SQL->Count; i++)

        {

                //遇到GO语句,执行

                if(SQL->Strings[i] == "GO")

                        ADOCommand1->Execute();

                else

                //清除注释

                if(SQL->Strings[i]SubString(0,2) == "/" || 

SQL->Strings[i]SubString(SQL->Strings[i]Length()-2 ,2) == "/")

                {

                }

                else

                //不是GO,不是注释,不为空,则是SQL的执行语句

                if(SQL->Strings[i]Trim() != "" && 

SQL->Strings[i]Trim() != " " )

                        ADOCommand1->CommandText += 

SQL->Strings[i] + " ";

        }

}

C:\Program Files\MySQL\MySQL Server 50\中包含空格,一个带路径的完整命令必须使用“”,如:

"C:\Program Files\MySQL\MySQL Server 50\bin\mysql" -u账号 -p密码 <指定路径的文件

另外,在命令中没有使用"-D数据库"选项指定 *** 作的数据库,你的sql文件中必须名使用"use 数据库名"

可以在命令编辑器或者Windows 的DB2 命令窗口或者 Linux 的shell 中执行SQL 脚本。在windows 的DB2 命令窗口或者 linux 的shell 中执行SQL语句,可以使用下面的命令执行script1sql脚本:

db2 -t -v -f script1sql -z script1log

或者:

db2 –tvf script1sql –z script1log

在上面的命令中,

-t 表示语句使用默认的语句终结符——分号;

-v 表示使用冗长模式,这样 DB2 会显示每一条正在执行命令的信息;

-f 表示其后就是脚本文件;

-z 表示其后的信息记录文件用于记录屏幕的输出,方便以后的分析(这是可选的,但我们建议使用该选项)。

当使用了-t选项而没有标明语句终结符,则分号(;)会默认为语句的终结符。有时可能会出现使用另外的终结符的情况,例如用SQL PL 编写的的脚本使用其它的符号而不是默认的分号,因为分号在SQL PL 是用于定义数据库对象过程中的语句结束。

有一个专门执行这种文件的,osql -S 127001 -U sa -P sa -i d:\testsql 要启动一个cmdexe,然后遍历那些文件,一个个循环执行,那文件里的sql一定要按照标准的写法

#!/bin/bash

HOSTNAME="19216811184" #数据库信息

PORT="3306"

USERNAME="root"

PASSWORD=""

DBNAME="test_db_test" #数据库名称

TABLENAME="test_table_test" #数据库中表的名称

使用sqlcmd可以在批处理脚本中执行SQL。虽然这个命令的参数很多,但幸运的是,我们不需要全部理解,在这里简要介绍以下几个:\x0d\{ -U login_id [ -P password ] } | _E trusted connection }] 如果指定了-E就不需要指定用户名密码,当然指定了用户名密码就不用-E了;\x0d\-S server_name [ \ instance_name ] 数据库服务器,如果不在本机的话必须指定;\x0d\-d db_name 数据库名字,必须的;\x0d\[ -i input_file ] [ -o output_file ] sql存在文件里的话用-i,输出到文件用-o;\x0d\[ -q "cmdline query" ] [ -Q "cmdline query" and exit ] 输入是简单的sql,不用文件,推荐用-Q,如果你执行完sqlcmd还需要执行别的动作的话;\x0d\[ -W remove trailing spaces ] 删除多余的空格,结果会更紧凑。\x0d\当我们在真正的脚本中执行sql时,通常需要传入和输出变量。\x0d\传入变量比较简单,如下所示:\x0d\sqlcmd -d test -Q "select from dboInvestment where investor=$(x)" -v x='IBM' -W\x0d\这个语句从test数据库的Investment表中选出investor等于x的所有行,注意到变量x被包含在${}中。\x0d\然后用-v定义了x的值,'IBM'。\x0d\-W确定输出的结果不包含多余的空格。\x0d\x的值如果没有在sqlcmd中设定,系统会试图从别的地方去寻找,可能的地方包括,系统环境变量,用户环境变量,以及用在sqlcmd之前用set设定的变量值。\x0d\如果你的数据里确实包含${},那么你并不希望进行变量的替换,使用-x选项可以禁止变量的替换。\x0d\有些时候,你还希望能获得sql执行结果并保存到变量中。比如你们的日志系统每天都在产生日志文件,你要执行一个脚本来处理这些日志文件并存到数据库中。在处理之前,你必须读取数据库以确定上次处理到那一天了。你期望这样能解决你的问题:\x0d\sqlcmd -d test -Q "select ${x}=max(date) from dbologDates " -W\x0d\但这样并不工作。因为sqlcmd并不提供输出变量。\x0d\不过你可以这样做:\x0d\sqlcmd -d test -Q "declare @x nvarchar(8);select @x=max(date) from dbologDates;print @x; " -W\x0d\这样你就可以得到一个干干净净的数字,而不会包含列名和其他信息。\x0d\接着你将上述结果导入到一个文件里:\x0d\sqlcmd -d test -Q "declare @x nvarchar(8);select @x=max(date) from dbologDates;print @x; " -W 1txt\x0d\现在到了最关键的一步,将文件的内容写入到变量里:\x0d\set /P myvar=回答于 2022-11-16

步骤:(1) 创建一个批处理文件:打开记事本,创建数据库连接信息(例如,server name,username,password,databasename等)以及要执行的sql脚本名称。具体语法参考下文"osql 实用工具" 。 将文件的扩展名改为bat 并保存。

示例1: 指定待执行sql 文件的相对路径

osql -S admin\admin -U sa -P sa -d TestDB -i c:\testsql

pause

示例2: 待执行文件与bat文件在同一个目录,指定相对路径

 set localdir=%~dp0

osql -S (local) -U sa -P sa -d Test -i %localdir%\test1sql

 osql -S (local) -U sa -P sa -d Test -i %localdir%\test2sql

osql -S (local) -U sa -P sa -d Test -i %localdir%\test3sql

pause

(2) 创建需要执行的sql 脚本, testsql,test2sql 和test3sql, 并放在步骤(1)示例1中指定的位置。本例为c:\ 根目录。如果用示例2,将待执行的sql和bat文件放在同一个目录下。

(3) 双击bat 文件并查看运行结果。

以上就是关于ADOCommand怎样批量执行sql语句,该怎么解决全部的内容,包括:ADOCommand怎样批量执行sql语句,该怎么解决、怎么用批处理*.bat 执行文件目录下面的mysql语句脚本、请教高手:DB2 SQL脚本批量执行如何保存日志问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10184829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存