【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL
原文:https://blog.csdn.net/zutsoft/article/details/45441343
编程往往与数据库密不可分,一个项目往往有很多的表,很多时候通过excel来维护表结构,记录表名,字段,类型,注释等等信息,将表结构整理到excel已经是件很累的事了,如果整理好的表结构只是用来查字段当字典用,那就太浪费了,excel提供vba编程,我们可以通过一段小脚本来实现一键创建表结构。使用脚本创建的语句需要标准化每个sheet页的格式,格式根据自己需要来做,这里给出我使用的格式和脚本。
EXCEL模板
VBA编程
打开excel vba编程工具,在ThisWorkbook中添加如下代码:
- Private Sub Workbook_BeforeClose(Cancel As Boolean)
- '关闭工作簿前,删除新创建的工具条先
- Dim bar_name As String
- bar_name = "HRBSJ"
- Application.CommandBars(bar_name).Delete
- On Error GoTo Exception
- Exit Sub
- Exception:
- End Sub
- Private Sub Workbook_Open()
- '打开工作簿时创建工具条
- Dim bar_name As String
- Dim new_bar As Office.CommandBar
- bar_name = "HRBSJ"
- Set new_bar = Application.CommandBars.Add(bar_name)
- new_bar.Visible = True
- new_bar.Position = msoBarLeft
- With new_bar.Controls.Add(Type:=msoControlButton, before:=1)
- .BeginGroup = True
- .Caption = "生成建表脚本"
- .TooltipText = "生成建表脚本"
- .Style = msoButtonCaption
- .OnAction = "Create_HR_Table_Script"
- End With
- On Error GoTo Exception
- Exit Sub
- Exception:
- End Sub
创建模块:
- Private Sub ShowTable()
- frmTable.Show
- End Sub
- Private Sub Create_HR_Table_Script()
- Dim line_tablename As Integer, len_col_id As Integer, len_str_type As Integer, col_num As Integer
- Dim do_column As Boolean, column_end As Boolean
- Dim table_name As String, str_col_id As String, str_space As String
- Dim primary_col As String, index_col As String, str_primary As String
- Dim str_temp As String, str_type As String, str_null As String, str_column As String
- max_line = 1000
- no_data = 0
- do_column = False
- column_end = False
- str_column = ""
- str_index = ""
- line_tablename = 6
- Set fs = CreateObject("Scripting.FileSystemObject")
- sFilePath = ActiveWorkbook.Path & "\Script\"
- If Dir(sFilePath, vbDirectory) = "" Then
- MkDir sFilePath
- End If
- sFileName = sFilePath & "Create_HR_Table_Script.sql"
- Set fhandle = fs.CreateTextFile(sFileName, True)
- fhandle.WriteLine ("--华融表结构创建脚本,对应数据库Oracle")
- fhandle.WriteLine ("--建表脚本创建开始:" & Date & " " & Time)
- fhandle.WriteLine ("")
- fhandle.WriteLine ("DECLARE")
- fhandle.WriteLine (" --判断表是否存在")
- fhandle.WriteLine (" FUNCTION fc_IsTabExists(sTableName IN VARCHAR2)")
- fhandle.WriteLine (" RETURN BOOLEAN AS")
- fhandle.WriteLine (" iExists PLS_INTEGER;")
- fhandle.WriteLine (" BEGIN")
- fhandle.WriteLine (" SELECT COUNT(*) INTO iExists FROM user_tables ut WHERE ut.table_name = UPPER(sTableName);")
- fhandle.WriteLine (" RETURN CASE WHEN iExists > 0 THEN TRUE ELSE FALSE END;")
- fhandle.WriteLine (" END;")
- fhandle.WriteLine ("")
- fhandle.WriteLine ("BEGIN")
- For i_index = 2 To Sheets.Count '第一页是目录这里的参数控制开始的页数到截止的sheet页
- Sheets(i_index).Select '从第二页开始,循环sheet页
- For i_line = 3 To max_line
- first_col = Trim(Sheets(i_index).Cells(i_line, 2))
- Select Case first_col
- Case "目标表说明"
- table_name = Trim(Sheets(i_index).Cells(3, 4))
- primary_col = Trim(Sheets(i_index).Cells(5, 4))
- index_col = Trim(Sheets(i_index).Cells(8, 4))
- If Len(primary_col) > 0 Then
- primary_col = Replace(primary_col, ",", ",")
- str_primary = "alter table " & table_name & " " & "add constraint pk_" & table_name & " primary key (" & primary_col & ")"
- Else
- str_primary = ""
- End If
- If Len(index_col) > 0 Then
- index_col = Replace(index_col, ",", ",")
- Else
- index_col = ""
- End If
- Case "序号"
- fhandle.WriteLine ("")
- fhandle.WriteLine ("/* Table:" & table_name & " " & Trim(Sheets(i_index).Cells(2, 2)) & " */")
- fhandle.WriteLine ("IF fc_IsTabExists('" & table_name & "') THEN")
- fhandle.WriteLine (" execute immediate 'drop table " & table_name & "';")
- fhandle.WriteLine ("END IF;")
- fhandle.WriteLine ("")
- fhandle.WriteLine ("execute immediate '")
- fhandle.WriteLine ("create table " & table_name)
- fhandle.WriteLine ("(")
- Case 1
- do_column = True
- Case ""
- do_column = False
- End Select
- If Trim(Sheets(i_index).Cells(i_line, 2)) = "" Then
- do_column = False
- End If
- str_temp = ""
- str_column = ""
- If do_column = True Then
- '标识最后一个字段列
- If Trim(Sheets(i_index).Cells(i_line + 1, 2)) = "" Or Trim(Sheets(i_index).Cells(i_line + 1, 3)) = "" Then
- column_end = True
- Else
- column_end = False
- End If
- '字段处理,及与数据类型的空格数处理
- str_col_id = Trim(Sheets(i_index).Cells(i_line, 3))
- len_col_id = Len(str_col_id)
- For i = len_col_id To 30
- str_space = str_space & " "
- Next
- str_column = str_col_id & str_space
- '数据类型的处理
- str_space = ""
- str_type = Trim(Sheets(i_index).Cells(i_line, 4))
- len_str_type = Len(str_type)
- For i = len_str_type To 16
- str_space = str_space & " "
- Next
- str_column = str_column & str_type & str_space
- '是否为空的处理
- str_space = ""
- str_temp = Trim(Sheets(i_index).Cells(i_line, 5))
- Select Case str_temp
- Case "N"
- str_null = "not null"
- Case Else
- str_null = ""
- End Select
- str_column = str_column & str_null
- '加一列
- If column_end = False Then
- str_column = str_column & ","
- fhandle.WriteLine (" " & str_column)
- Else
- fhandle.WriteLine (" " & str_column)
- fhandle.WriteLine (") tablespace TS_TDC';")
- End If
- End If
- Next ' 结束工作表的循环
- '--加注释
- If Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
- fhandle.WriteLine (" -- Add comments to the table")
- fhandle.WriteLine ("execute immediate 'comment on table " & Trim(Sheets(i_index).Cells(3, 4)) & " is ''" & Trim(Sheets(i_index).Cells(2, 2)) & "''';")
- fhandle.WriteLine (" -- Add comments to the columns")
- For i_line = 15 To max_line
- If Trim(Sheets(i_index).Cells(i_line, 2)) <> "" And Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
- fhandle.WriteLine ("execute immediate 'comment on column " & Trim(Sheets(i_index).Cells(3, 4)) & "." & Trim(Sheets(i_index).Cells(i_line, 3)) & " is ''" & Trim(Sheets(i_index).Cells(i_line, 7)) & "''';")
- End If
- Next ' 结束工作表的循环
- End If
- '--加主键
- If Len(str_primary) > 0 And Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
- fhandle.WriteLine ("")
- fhandle.WriteLine ("execute immediate '" & str_primary & " using index tablespace TS_TDC';")
- End If
- '--加索引
- If Len(index_col) > 0 And Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
- fhandle.WriteLine ("")
- fhandle.WriteLine ("execute immediate 'create index i_" & table_name & " on " & table_name & " (" & index_col & " ) tablespace TS_TDC';")
- End If
- Next '结束工作簿的循环
- fhandle.WriteLine ("")
- fhandle.WriteLine ("END;")
- fhandle.WriteLine ("/")
- fhandle.Close
- Sheets(1).Select
- MsgBox "表结构创建脚本成功!文件名" & sFileName
- End Sub
保存后可在excel上看到 ‘生成建表脚本’ 按钮
最终的生产结果示例
- --表结构创建脚本,对应数据库Oracle
- --建表脚本创建开始:2015/5/2 18:35:26
- DECLARE
- --判断表是否存在
- FUNCTION fc_IsTabExists(sTableName IN VARCHAR2)
- RETURN BOOLEAN AS
- iExists PLS_INTEGER;
- BEGIN
- SELECT COUNT(*) INTO iExists FROM user_tables ut WHERE ut.table_name = UPPER(sTableName);
- RETURN CASE WHEN iExists > 0 THEN TRUE ELSE FALSE END;
- END;
- BEGIN
- /* Table:TEST 测试表 */
- IF fc_IsTabExists('TEST') THEN
- execute immediate 'drop table TEST';
- END IF;
- execute immediate '
- create table TEST
- (
- c_unique_no VARCHAR2(32) not null,
- c_proj_no VARCHAR2(40) not null,
- c_busi_type VARCHAR2(40) not null,
- c_cust_ID VARCHAR2(32)
- ) tablespace TEST';
- -- Add comments to the table
- execute immediate 'comment on table TEST is ''测试表''';
- -- Add comments to the columns
- execute immediate 'comment on column TEST.c_unique_no is ''PK主键''';
- execute immediate 'comment on column TEST.c_proj_no is ''项目编号''';
- execute immediate 'comment on column TEST.c_busi_type is ''业务类型''';
- execute immediate 'comment on column TEST.c_cust_ID is ''客户ID''';
- execute immediate 'alter table TEST add constraint pk_TEST primary key (c_unique_no) using index tablespace TEST';
- END;
- /
【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL的更多相关文章
- Kettle根据表输入的SQL脚本返回创建表的SQL脚本
其中[物料分组]节点就是表输入,里面可以构建SQL查询.那么怎么把生成的数据插入到目标表中?并且构建目标表的结构呢? 目标表结构就在[表输出]栏位 点击[SQL],就可以看见生成目标表结构的脚本
- SQL Server 动态创建表结构
需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...
- Linq to Sql自动生成实体类重名情况的处理
使用Linq to sql自动生成实体类时,如果要生成多个库的实体类,往往会遇到类名重名的情况,也就是表名重名,这样编译会不通过,这种情况下要在自动生成的实体类文件中(.designer.cs后缀)将 ...
- [Silverlight][linq to sql]不能找到linq to sql自动生成类型
最近在做Silverlight项目,结合使用了WCF RIA service,通过linq to sql自动生成model类型,使用起来非常方便.具体可见linq to sql之silverlight ...
- EF:根据实体类生成表结构SQL
根据实体类生成表结构SQL: PM> Enable-Migrations -ProjectName Domain -StartUpProjectName Handler -Force PM> ...
- (转载)根据数据字典表定义的表结构,生成创建表的SQL语句
<来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1. 类名:T ...
- DjangoORM创建表结构以及生成数据库结构
1. ORM的两种 DB first: 创建表结构--根据表结构生成类-----根据类来操作数据库 Code first: 先写代码------再写类----执行命令(一个类生成一个表)当前主流的用法 ...
- SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束
创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...
- EF-使用迁移技术让程序自动更新数据库表结构
承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...
随机推荐
- python简单小程序
#足球队寻找10 到12岁的小女孩(包含10岁和12岁),编写程序询问用户性别和年龄,然后显示一条消息指出这个人是否可以加入球队,询问10次,输出满足条件的总人数#询问10次,输出满足要求的总人数 o ...
- 使用 Visual Studio Code 进行远程开发
使用 Visual Studio Code 进行远程开发 在完成了 AT 指令入门的学习之后,接下来就要使用 AT 指令进行 Socket 通信了.问题在于,之前 .NET 的 Socket 编程只需 ...
- Integer类入门学习
Integer类 它是一个类,是 int 基本数据类型的封装类. 基本API Integer 类和 int 的区别 Integer 是 int 包装类,int 是八大基本数据类型之一(byte,sho ...
- appium启动app(android)
android Appium 启动APP至少需要5个参数 'platformVersion','deviceName'.'appPackage'.'appActivity'.'platform ...
- maven parent 与 import 的区别
在 maven 配置文件 pom.xml 中可以 引入 <parent>,方式如下(举例是 spring-boot-starter-parent 中的继承关系) <parent& ...
- 【题解】GREWords(AC自动机)
[题解]GREWords(AC自动机) SP9941 GRE - GRE Words 题目大意: 给定一个由字符串构成的序列,不同位置的字符串有自己权值.现在让你选出一个子序列,使得在这个子序列中,前 ...
- 洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心
正解:三分+贪心 解题报告: 传送门$QwQ$ 其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$ #include <b ...
- $Noip2012/Luogu1083$ 借教室
$Luogu$ $Sol$ 区间整体加减? 差分+树状数组维护前缀和! 那每给一个人借完教室之后都要判断一下现在合不合法?那复杂度比暴力还不如些... 注意到这里的单调性,假设给前$x$个人借完教室之 ...
- CF1272D. Remove One Element 题解 动态规划
题目链接:http://codeforces.com/contest/1272/problem/D 题目大意: 给你一个长度为 \(n\) 的数组,你最多删除一个元素(也可以不删),求此条件限制下的最 ...
- 1045 快速排序 (25 分)C语言
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同的正整数的排列,请问 ...