董 威
(国家税务总局苏州市税务局,江苏 苏州 215004)
数据库应用已深入各个领域,数据的存储、分析都离不开数据库的支撑。将数据需求转化为数据库表,是每一个数据库系统初期建设阶段的必要工作。如果把建表所需要素按设定格式存放在表格中,那么可以用VBA实现一键生成建表语句。以下说明具体实现方法。
以ORACLE数据库为例,将待建数据表要素按如表1的格式填写。
表1 建表基本信息
按表1的信息,需要生成的建表语句如下:
1 create tablet_spkcb(
2 sp_id cha(r6) not nul,
3 spmc varchar2(200) not null,
4 spsl number,
5 lrsj date,
6 lrr cha(r6)
7 );
8 comment on table is'商品库存表';
9 comment on column spkcb.sp_id is'商品_id';
10 comment on column spkcb.spmc is'商品名称';
11 comment on column spkcb.spsl is'商品数量';
12 comment on column spkcb.lrsj is'录入时间';
13 comment on column spkcb.lrr is'录入人';
14 alter table t_spkcb add constraint sp_id primary key(sp_id);
其中1~7行为基本建表语句,第8行增加表名备注,第9~13行增加字段备注,第14行为生成主键的语句。
1)首先判断表1使用的行数,据此确定字段总数;
2)根据表1中的表名,拼接建表语句第1行;
3)根据表1中的表名及备注拼接第8行增加备注;
4)循环提取表1中4~8行信息:拼接9~13行字段备注语句;拼接2~7行建表基本语句,如果是末行加“);”
5)根据表1中E列的星号*位置,拼接第14行生成主键
按照以上思路,VBA脚本如下,其中vbCrLf为换行符,单引号后的楷体字为注释。
在建表界面插入表单控件按钮,修改名称为“Create SQL”,指定宏为CreateTable()。这样,在建表信息准备好之后,点击按钮,即可生成建表语句。
实际应用中,数据库字段常采用中文拼音首字母的缩写表达。为实现这一功能,首先编写提取单个汉字拼音首字母的函数。在GB2312标准字符集中,一级汉字按拼音字母顺序排列的,因此可以分段来确定首字母。该字符集的区位码经过加20H和80H转为内码[3],和VBA中ASC()函数值相匹配。内码与VBA的ASC()函数[5]值均以首个一级汉字的对应值归零为基准进行分段,结果一致。相关的转换过程及公式示意如图1所示。
图1 汉字编码转换过程示意图
提取拼音首字母的函数脚本如下:
这段代码以GB2312字符集[2]为依据,可以识别3 755个一级汉字的拼音首字母。如果遇到数字、字母和下划线“_”则保持不变,二级汉字及其他字符均不输出。在此基础上,如果是多个汉字,则循环拼接,即可完成多个汉字的首字母拼音转换。脚本如下:
需要说明的是,EXCEL单元格中不显示的特殊字符有可能影响转换结果。所以这段代码进行了去空格和去换行符的处理,如遇到其他字符也需要类似操作。
这种方式下,表1的信息中不再需要填写a列的字段名,只需要将字段中文名填入c列,a列通过函数py()自c列获取,即在CreateTable()脚本里for循环体中,将第2句:
修改为两句:
表名也类似,不过增加“t_”以符合表名命名规则。在CreateTable()脚本中,将第3句:tab_name=Range("a2")
修改为两句:
这样,表1只需填写表中文名、字段中文名、字段数据类型、是否为空、主键标识等信息,然后点击“Create SQL”,即可快速生成相应的SQL语句,同时在a列生成表名和字段名,供进一步确认。
在实际应用中,还可能需要的有:不同字段的中文名有可能对应相同的字母组合,而数据库不允许重名字段,因此脚本还需要增加检测和处理功能;为使生成建表语句本格式更加规范,还可以采用space(n)函数在适当的位置添加空格;语句的最后一行,还可以加一段拼接select或desc语句的脚本,确认新表创建成功;语句第一行增加drop table语句,以适应重复建表。这些都属于应用中的细节,此处不再赘述。
以上,是利用VBA快速生成建表语句的方法。与此类似,如果需要将数据批量插入数据表,或者补充大量表及字段备注等语句,也可参照以上思路实现。