Sql server 编写脚本并将MS Access宏导出到SQL

Sql server 编写脚本并将MS Access宏导出到SQL,sql-server,excel,vba,ms-access,macros,Sql Server,Excel,Vba,Ms Access,Macros,我有几十个这样的宏: 我想做的是用SQL编写整个宏的脚本。我知道这可以通过打开查询并选择SQL视图手动完成。 例如,如果打开第一个查询Build BOM-Part 0A,并选择SQL视图,将显示: 从[物料清单成本]中删除 是否有一种方法可以自动为整个宏完成此操作,而无需进入每个查询和宏?您可以使用VBA代码获取(至少部分)所需内容。例如,您可以使用遍历当前数据库中的所有宏 Dim作为对象 对于CurrentProject.AllMacros中的每个m 将宏名称变暗为字符串 宏名称=m.名称

我有几十个这样的宏:

我想做的是用SQL编写整个宏的脚本。我知道这可以通过打开查询并选择
SQL视图
手动完成。 例如,如果打开第一个查询
Build BOM-Part 0A
,并选择
SQL视图
,将显示:

从[物料清单成本]中删除


是否有一种方法可以自动为整个宏完成此操作,而无需进入每个查询和宏?

您可以使用VBA代码获取(至少部分)所需内容。例如,您可以使用遍历当前数据库中的所有宏

Dim作为对象
对于CurrentProject.AllMacros中的每个m
将宏名称变暗为字符串
宏名称=m.名称
调试。打印宏名
下一个
现在,不必简单地打印宏名称,您可以使用

Application.SaveAsText acMacro,宏名,“C:\Users\Gord\Desktop\macroDump.txt”
这将生成一个如下所示的文件

Version=196611
PublishOption=1
列显示=0
开始
Action=“OpenQuery”
Argument=“MyUpdateQuery”
参数=“0”
Argument=“1”
终点
开始
Comment=“\u AXL:\015\012MyUpdateQuery”
终点
然后可以解析该文件,查找包含
Action=“OpenQuery”
的开始/结束块,并检索查询名称。这样,您就可以打开QueryDef对象并检索其SQL

Dim cdb作为DAO.Database
设置cdb=CurrentDb
将qdf设置为DAO.QueryDef
设置qdf=cdb.QueryDefs(queryName)'MyUpdateQuery
Dim querySql作为字符串
querySql=qdf.SQL

您可以使用VBA代码获取(至少部分)您需要的内容。例如,您可以使用遍历当前数据库中的所有宏

Dim作为对象
对于CurrentProject.AllMacros中的每个m
将宏名称变暗为字符串
宏名称=m.名称
调试。打印宏名
下一个
现在,不必简单地打印宏名称,您可以使用

Application.SaveAsText acMacro,宏名,“C:\Users\Gord\Desktop\macroDump.txt”
这将生成一个如下所示的文件

Version=196611
PublishOption=1
列显示=0
开始
Action=“OpenQuery”
Argument=“MyUpdateQuery”
参数=“0”
Argument=“1”
终点
开始
Comment=“\u AXL:\015\012MyUpdateQuery”
终点
然后可以解析该文件,查找包含
Action=“OpenQuery”
的开始/结束块,并检索查询名称。这样,您就可以打开QueryDef对象并检索其SQL

Dim cdb作为DAO.Database
设置cdb=CurrentDb
将qdf设置为DAO.QueryDef
设置qdf=cdb.QueryDefs(queryName)'MyUpdateQuery
Dim querySql作为字符串
querySql=qdf.SQL

虽然不是完全自动化的,类似于@ Gordthopps'的建议,考虑将每个宏中的所有查询名称手动收集到VBA数组中,然后迭代遍历集合,将每一个都写入一个正在增长的文件:

Public Sub-ExtractSQL()
Dim db作为DAO.Database,qdef作为DAO.Querydef
Dim qry为变型,qry为变型
Dim strSQL作为字符串,sqlFile作为字符串
Set db=CurrentDb
qrys=数组(“Query1”、“Query2”、“Query3”)
sqlFile=“C:\Path\To\allquerys.sql”
'打开SQL文本文件
打开sqlFile,输出为#1
对于db.querydfs中的每个qdef
对于qry中的每个qry
如果qdef.Name=qry,则
打印#1,qdef.SQL'SQL语句
打印#1,“”'行分隔符
如果结束
下一季
下一个qdef
'关闭SQL文本文件
关闭#1
设置qdef=Nothing
Set db=Nothing
端接头

注意:Access SQL在SQL Server的T-SQL中不容易兼容。这两种方言有点不同。因此,需要进行一些翻译,包括
IIF()
CASE
(如果在2012年之前使用SQL Server);不使用双引号括起字符串文字;没有交叉表枢轴;在不完全自动化的情况下,类似于@ Gordthopps'的建议,考虑将每个宏中的所有查询名称手动收集到一个VBA数组中,然后迭代遍历集合,将每个文件写入一个正在增长的文件:

Public Sub-ExtractSQL()
Dim db作为DAO.Database,qdef作为DAO.Querydef
Dim qry为变型,qry为变型
Dim strSQL作为字符串,sqlFile作为字符串
Set db=CurrentDb
qrys=数组(“Query1”、“Query2”、“Query3”)
sqlFile=“C:\Path\To\allquerys.sql”
'打开SQL文本文件
打开sqlFile,输出为#1
对于db.querydfs中的每个qdef
对于qry中的每个qry
如果qdef.Name=qry,则
打印#1,qdef.SQL'SQL语句
打印#1,“”'行分隔符
如果结束
下一季
下一个qdef
'关闭SQL文本文件
关闭#1
设置qdef=Nothing
Set db=Nothing
端接头

注意:Access SQL在SQL Server的T-SQL中不容易兼容。这两种方言有点不同。因此,需要进行一些翻译,包括
IIF()
CASE
(如果在2012年之前使用SQL Server);不使用双引号括起字符串文字;没有交叉表枢轴;和其他项目。

使用宏记录器执行一次,您将获得所需的基本代码。@AlbertD.Kallal为了澄清,我建议能够获取宏/查询的SQL脚本,而不是使用SQL编写脚本…(请在您的评论中更具建设性)@AlbertD.Kallal我从未想过我必须编写此脚本,但请停止在网站上使用“牛仔小丑”。“把别人比作牛仔竞技小丑,无论是喝醉了还是失业了,从来都不合适。”米加在我的记录中写道