当对企业级的高性能的数据库的要求和需求增加时,客户有时需要从文件?服务器环境的Microsoft Access Jet引擎迁移到客户?服务器环境的Microsoft SQL Server。随同微软Office 2000发行的Access 2000 Upsizing Wizard(升级向导)可以把Access表格和查询迁移到SQL Server 7.0。如果你使用Access的早期版本,你也可以通过升级到Access 2000,并使用升级向导把你的应用程序移植到SQL SERVER。
如果你不喜欢使用Access 2000和升级向导进行移植,那么这篇文章作为向迁移一个Access应用程序到SQL Server。要迁移Access应用程序,你需要首先把数据迁移到SQL Server 7.0,然后把Access查询移植到数据库或SQL文件,最后是移植应用程序。
移植中使用的SQL Server工具
SQL Server中的一些工具可以帮助你移植Access数据和应用程序
SQL Server企业管理器
SQL Server企业管理器允许对SQL Server和SQL Server对象的企业范围的设置和管理。SQL Server企业管理器提供了一个强大的任务安排引擎、管理警告能力、以及内建的复制管理界面。你还可以用SQL Server企业管理器来:
管理登录和用户权限 创建脚本 管理SQL SERVER对象的备份 备份数据库和事务日志 管理表、视图、存储过程、触发器、索引、规则、缺省设定和自定义数据类型
创建全文索引、数据库图表和数据库维护方案 输入输出数据 转换数据 执行不同的Web网络管理任务 缺省情况下,SQL Server企业管理器被SQL Server作为服务器软件的一部分安装在运行Windows NT操作系统的计算机上,同时作为客户软件的一部分安装在运行Windows NT和Windows 95操作系统的计算机上。你很可能要从SQL Server企业管理器的图形用户界面启动数据转换服务(Data Transformation Services,DTS)。
数据转换服务(DTS)
数据转换服务允许你在使用一个OLE DB结构的多个数据源之间输入和输出数据,这样的数据源有Microsoft Excel电子表格,以及在运行SQL Server 7.0的多台计算机之间执行数据库和数据库对象的传输。你还可以用DTS来执行数据转换,以便用它来通过一个在线事务处理系统建立数据仓库和数据商场。
DTS向导允许你交互的创建使用OLE DB和ODBC来进行输入、输出、确认和不同数据的转换的DTS包。向导还允许你在相关数据库之间拷贝计划和数据。
SQL SERVER查询分析器(Server Query Analyzer)
SQL SERVER查询分析器是一个图形化查询工具,它允许你可视化的分析一个查询方案,同时执行多重查询、查看数据、获得索引建议。SQL Server查询分析器提供显示方案(showplan)选项,可以用它来报告SQL Server查询优化器选择的数据获取方案。
SQL Server轮廓(Server Profiler)
SQL SERVER轮廓实时捕捉服务器活动的连续的记录。SQL Server轮廓允许你监控通过SQL Server产生的事件,过滤基于用户指定准则的事件和直接跟踪到显示器、文件或者表的输出。使用SQL Server轮廓,你可以重放先前的捕捉记录。这个工具帮助应用程序开发人员鉴别可能使应用程序性能恶化的事务。当从一个基于文件的体系结构移植一个应用程序到一个基于客户/服务器的体系结构时,它是很有帮助的,因为最后的步骤包含针对应用程序的新客户/服务器环境优化该应用程序的操作。
移动表格和数据
使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:
在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation
Services(数据转换服务),然后选择Import Data(导入数据)。
在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as th e Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。
在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。
在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。
在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。
移植Microsoft Access查询
你必须以这些格式之一迁移你现有的Access查询到SQL Server:
Transact-SQL脚本 Transact-SQL语句通常从数据库程序被调用,但是你可以使用包含在SQL Server
7.0中的SQL Server查询分析器在数据库中直接运行它们。SQL Server查询分析器帮助开发者针对开发数据库测试Transact-SQL语句,或运行Transact-SQL语句执行查询、数据操作(INSERT、UPDATE、DELETE)或数据定义(CREATE TABLE)。
存储过程 开发者可以把大多数源于Access查询(SELECT、INSERT、UPDATE和DELETE)的Tr ansact-SQL语句转换为存储过程。用Transact-SQL写的存储过程可以用来封装和标准化你的数据访问,存储过程实际上存储在数据库内。存储过程能带或者不带参数运行,可以从数据库程序调用,也可以从SQL Server查询分析器手动执行。
视图 视图作为虚拟的表格从一个或更多的表格显露指定的行和列。它们允许用户创建查询而不用直接实现那些复杂的底层查询。视图不支持参数。向视图加入一个更多的表格不能使用INSERT、UPDATE、或DELETE语句修改。视图可以用Transact-S QL语句调用,并且也可以在SQL Server查询分析器中的*.scripts中使用。SQL S erver视图和SQL-92标准不支持视图中的ORDER BY子句。
更多关于Transact-SQL、存储过程或者视图的信息,见SQL Server Books Onlin e。
Access查询类型
SQL Server移植选项和注释
一个SELECT语句可以被存储在Transact-SQL文件、存储过程或者视图中。
创建存储过程是实现把数据库应用程序开发同数据库设计的物理实现分离的最好方法。存储过程在一个地方创建,并且被应用程序调用。
如果底层数据库改变了,并且存储过程被仔细的修改以反映这些变化,则对存储过程的调用不会被“中断”。
CROSSTAB 交叉表经常用于摘要报告。
Access交叉表可以在SQL脚本中作为Transact-SQL SELECT语句实现,也可以作为存储过程或者一个视图实现。每次一个查询被列举的时候,数据节点将会重执行,请确保使用最新的数据。
根据不同的数据库需要,也许把交叉表中的数据存储为临时表比较合适(请参看下一行的MAKE TABLE)。临时表只需要很少的资源,但是只提供了创建临时表的时刻,数据的一个照相。
MAKE TABLE
Access的MAKE TABLE可以在Transact-SQL脚本或者存储过程中作为Transact-SQ L的CREATE TABLE语句实现。语法如下:
SELECT [ ALL | DISTINCT ]
[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]
[ INTO new_table ]
[ FROM {} [,…n] ]
[ WHERE ]
[ GROUP BY [ALL] group_by_expression [,…n]
[ WITH { CUBE | ROLLUP } ]
CREATE TABLE mytable (low int, high int)
UPDATE
UPDATE语句可以被存储在Transact-SQL脚本中;但是,实现UPDATE语句的推荐方法是创建一个存储过程。
APPEND
APPEND语句可以被存储在Transact-SQL脚本中;但是,实现APPEND语句的推荐方法是创建一个存储过程。
DELETE
DELETE语句可以被存储在Transact-SQL脚本中;但是,实现DELETE语句的推荐方法是创建一个存储过程。
把微软Access查询迁移到存储过程和视图
每个Access查询必须被置入这集合语句的集合:
CREATE PROCEDURE AS
< SELECT, UPDATE, DELETE, INSERT, CREATE TABLE statement from Microsof t Access >
GO
CREATE VIEW AS
GO
对每个Access查询:
打开Access,然后在SQL Server上打开SQL Server查询分析器。
在Access中,在数据库窗口,单击Queries(查询)标签,然后单击Design(设计)。
在View(视图)菜单上,单击SQL。
粘贴整个查询到SQL Server查询分析器。
测试语法和并且为以后使用保存Transact-SQL语句,或者在数据库中运行语句。
你可以有选择的保存Transact-SQL为脚本。
移植微软Access查询到Transact-SQL脚本
大多数Access查询应该被翻译成存储过程和视图。然而,应用程序开发人员很少运行一些语句可以作为一个Transact-SQL脚本存储,这是一个文件扩展名为.sql 的文本文件。这些文件可以从SQL Server查询分析器中运行。
如果你计划把你的一些Access查询转换为.sql文件,考虑把Transact-SQL语句分成几个脚本,具体操作要根据如何使用这些语句而定。例如,你可以把那些必须以同一频率运行的Transact-SQL语句组合到一个脚本中。另一个脚本可能包含那些只能在特定条件下运行的Transact-SQL语句。另外,那些必须按一定的顺序执行的Transact-SQL语句应该组合在一个离散脚本中。
要把一个Access语句转换为Transact-SQL文件:
复制该语句到SQL Server查询分析器。
使用蓝色的检查标记图标解析语句。
如果合适就执行语句。
MAKE TABLE 语句在SQL Server中有几种转换方式。开发人员可以创建下面任意一种:
视图 视图创建一个动态的、提供最新信息的虚拟临时表格的效果。这是I/O密集的,因为每次列举一个查询时就要重新加入数据表。
临时表。
临时表为一个连接用户会话创建一个数据快照。你可以创建局部和全局临时表。
局部临时表只能在当前会话中是可视的;全局临时表对所有会话都是可视的。局部临时表的前缀用单一的数字符号命名(#table_name),全局临时表的前缀用两个数字符号命名(##table_name)。对临时表的查询运行得很快,因为它们通常只使用一个表格而不是动态的连接几个表来获得一个结果集。
关于临时表的更多信息,见SQL Server Books Online。
在SQL SERVER7.0中数据变换服务(DTS)允许你通过创建包实现临时表创建的标准化、自动化和定期计划执行。
例如,当你移植Access 2.0 Northwind示例数据库时,为季度数据报告而创建的交叉表被转换为一个视图或者是在常规基础上创建临时表的数据转换。关于DTS的更多信息,参见SQL Server Books Online。
附加设计考虑
下面是一些当你把你的Access应用程序移植到SQL Server时应该考虑的问题。
使用参数
带参数的SQL Server存储过程需要一种来自Access查询的不同的语法,例如:
Access 2.0:
查询名称:Employee Sales By Country, in NWIND.mdb:
PARAMETERS [Beginning Date] DateTime, [Ending Date] DateTime; SELECT Orders.[Order ID], [Last Name] & ", " & [First Name] AS Salespe rson, Employees.Country, Orders.[Shipped Date], [Order Subtotals].Subt otal AS [Sale Amount]
FROM Employees INNER JOIN (Orders INNER JOIN [Order Subtotals] ON Orde rs.[Order ID] = [Order Subtotals].[Order ID]) ON Employees. = Orders.
WHERE (((Orders.[Shipped Date]) Between [Beginning Date] And [Ending D ate]))
ORDER BY [Last Name] & ", " & [First Name], Employees.Country, Orders. [Shipped Date];
SQL Server 7.0:
CREATE PROCEDURE EMP_SALES_BY_COUNTRY @BeginningDate datetime,
@EndingDate datetime
AS
SELECT Orders.[Order ID], [Last Name] + ", " + [First Name] AS Salespe rson, Employees.Country,
Orders.[Shipped Date], [Order Subtotals].Subtotal AS [Sale Amount]
FROM Employees INNER JOIN (Orders INNER JOIN [Order Subtotals] ON Orde rs.[Order ID] = [Order Subtotals].[Order ID]) ON Employees. = Orders.
WHERE (((Orders.[Shipped Date]) Between @BeginningDate And @EndingDate ))
ORDER BY [Last Name] + ", " + [First Name], Employees.Country, Orders. [Shipped Date]
GO
更多信息,请参看SQL Server Book Online
嵌套查询(Nested Queries)
在嵌套形式中,某些Access查询是在别的查询的顶层上创建的。Access中的嵌套查询在SQL Server中变成为嵌套视图。而ORDER BY不能作为视图定义的一部分,可以用附加一个查询视图的SELECT语句来代替它。如果你有嵌套的Access查询,你需要创建一系列视图,然后创建那些在视图上执行SELECT语句的存储过程,并且把ORDER BY子句粘贴到SELECT语句上。
例如,下面的Access查询:
SELECT * FROM STUDENTS
WHERE COUNTRY = "USA"
ORDER BY LAST_NAME
变成一个SQL Server视图和存储过程
CREATE VIEW US_STUDENTS AS SELECT * FROM STUDENTS
WHERE COUNTRY = "USA"
CREATE PROCEDURE US_STUDENTS_ORDER AS
SELECT * FROM US_STUDENTS ORDER BY LAST NAME
检查SQL Server
你可以使用SQL Server查询分析器的查询菜单上的Parse命令检查SQL Server中的视图或存储过程函数。在下面的例子中,Access查询使用DISTINCTROW。SQL Ser ver使用Transact-SQL DISTINCT命令执行相同的操作。Parse命令允许开发人员孤立并且修改他们的Access查询中的语法问题。
连接你的应用程序
许多Access应用程序是用Microsoft Visual Basic for Applications或Visual Basic for Applications Access用户接口写成的。
使用Visual Basic for Applications作为应用程序开发环境的应用程序能在SQL
Server下运行,用Jet ODBC驱动程序。
使用Access用户接口中的窗体和报表的应用程序能使用连接表访问SQL Server。
如果你的应用程序要使用连接表,确保所有Access表转移到SQL Server以增强性能。对Access (Jet)和SQL Server的混合体使用连接表创建查询是资源密集的。
移植你的文件-服务器应用程序到客户/服务器模型第一步是确保应用程序能在新数据库上工作。下一步是通过下面的方法为客户/服务器环境优化应用程序:
监听传送到服务器的Transact-SQL语句。
SQL SERVER轮廓是监听Transact-SQL语句怎样被送到数据库的一个有用的工具。
如果你在SQL Server上运行没有修改的Access应用程序,你可能会通过使用DAO和Jet/ODBC驱动程序向数据库传送未经优化的Transact-SQL。例如,使用Jet/ODBC 驱动程序的DELETE语句来删除1000行将产生1000次到数据库的调用,这将会严重的影响产品数据库的性能。在这个例子中,SQL SERVER轮廓展示了1000个删除语句,允许你使用有Microsoft OLE DB Provider for SQL Server和Microsoft Ac tiveX Data Objects (ADO)修改应用程序,从而改进应用程序的效率。
实现高效索引。
在你确定传送到数据库的Transact-SQL语句的效率以后,你可以使用索引更有效的调整那些语句。索引调整向导(Index Tuning Wizard)允许你查找瓶颈,并且向你提出建议。你的语句并没有被修改,但是由于正确使用索引而使它们的性能提高了。
SQL SERVER和Access查询语法
下列的表格显示SQL SERVER和Access查询语法之间对应的区别。
Access查询语法
SQL Server查询语法
查询中的ORDER BY 在视图中不支持ORDER BY
DISTINCTROW
DISTINCT
用"&"做字符串联用"+"做字符串联
支持的子句/操作符:
SELECT SELECT TOP N INTO FROM WHERE GROUP BY HAVING UNION (ALL) ORDER BY WITH OWNERACCESS 支持的子句/操作符:
SELECT SELECT TOP N INTO FROM WHERE GROUP BY HAVING UNION (ALL) ORDER BY COMPUTE FOR BROWSE OPTION
不支持: COMPUTE, FOR BROWSE, OPTION 不支持: WITH OWNERACCESS
统计函数:
AVG
COUNT(column)
COUNT(*)
MIN
MAX
FIRST
LAST
STDEV, STDEVP
SUM
VAR, VARP 统计函数:
AVG([ALL | DISTINCT] expression)
COUNT([ALL | DISTINCT] expression)
COUNT(*)
GROUPING (column_name)
MAX(expression)
MIN(expression)
STDEV, STDEVP
SUM([ALL | DISTINCT] expression)
VAR, VARP
不支持: FIRST, LAST
TRANSFORM
(SELECT statement)
PIVOT
WITH ROLLUP, WITH CUBE on SELECT statements
MAKE TABLE, ALTER TABLE
支持的子句:
CONSTRAINT
ADD COLUMN
DROP COLUMN
DROP INDEX
Also, stand-alone statement: DROP INDEX
CREATE TABLE, ALTER TABLE
支持的子句:
CONSTRAINT
ADD COLUMN
DROP COLUMN
Stand-alone statement: DROP INDEX