隨著(zhù)用戶(hù)對于企業(yè)級高性能數據庫的需求的增長(cháng),用戶(hù)時(shí)常要從Microsoft Access Jet引擎的文件-服務(wù)器環(huán)境下轉換到Microsoft SQL Server的客戶(hù)-服務(wù)器環(huán)境。Microsoft Office 2000中的Access 2000 Upsizing Wizard可實(shí)現將數據表和查詢(xún)轉移到SQL Server 7.0中。如果您用的是Access的較早的版本,您可以先將它升級為Access 2000,然后再使用其中的Upsizing Wizard,從而將您的應用移植到SQL Server中。
如果您并不太愿意采用Access 2000 和Upsizing Wizard來(lái)實(shí)現移植,本文可以作為將Access 2000移植到SQL Server的一個(gè)指南。轉移一個(gè)Access上的應用首先需要將數據轉移到SQL Server,然后將查詢(xún)轉移進(jìn)數據庫,或是轉移為SQL文件以備稍后執行。最后要采取的步驟是移植應用程序。
數據庫移植中用到的SQL Server 工具
SQL Server管理器(SQL Server Enterprise Manager)
SQL Server管理器 允許對SQL Server以及SQL Server中的對象進(jìn)行企業(yè)級的配置和管理。SQL Server管理器提供一個(gè)強有力的scheduling引擎,高度的容錯力和一個(gè)嵌入式的復制管理界面。使用SQL Server管理器可以實(shí)現以下功能:
管理連接和用戶(hù)許可
創(chuàng )建腳本程序
管理SQL Server對象的備份
備份數據和事務(wù)處理日志
管理表、視圖、存儲過(guò)程、觸發(fā)器、索引、規則、默認值以及用戶(hù)定義的數據類(lèi)型
建立全文本索引、數據庫圖表和數據庫維護計劃
輸入和輸出數據
轉換數據
執行各種網(wǎng)絡(luò )管理任務(wù)
在以Microsoft Windows NT為操作系統的計算機中,SQL Server Manager由SQL Server Setup進(jìn)行安裝,并被默認為服務(wù)器組件,而在運行著(zhù)Windows NT 和Microsoft Windows 95的機器上,它將被默認為客戶(hù)方組件。您將從SQL Server Manager的圖形用戶(hù)界面中啟動(dòng)數據轉移服務(wù)(DTS,Data Transformation Services)。
數據轉移服務(wù)(Data Transformation Services ,DTS)
數據轉移服務(wù)允許您在多種異構數據源之間輸入和輸出數據,這些數據源采用基于數據庫的OLE體系結構;或在使用SQL Server 7.0的多個(gè)計算機之間轉移數據庫和數據庫對象;您還可以通過(guò)運用數據轉移服務(wù),更便捷地在一個(gè)在線(xiàn)事務(wù)處理系統(OLTP)中建立數據倉庫和數據中心。
DTS Wizard允許您交互地創(chuàng )建DTS包,通過(guò)OLE DB和ODBC來(lái)輸入、輸出、驗證和轉移數據。DTS Wizard還允許您在關(guān)系型數據庫之間拷貝圖解(schema)和數據。
SQL Server 查詢(xún)分析器(Query Analyzer)
SQL Server 查詢(xún)分析器是一種圖形化的查詢(xún)工具,通過(guò)它您可以分析一個(gè)查詢(xún),同時(shí)執行多個(gè)查詢(xún),查看數據和獲取索引建議。SQL Server 查詢(xún)分析器提供了showplan選項,可用來(lái)顯示SQL Server查詢(xún)優(yōu)化器所選擇的數據提取方法。
SQL Server Profiler
SQL Server Profiler可以實(shí)時(shí)地捕獲數據庫服務(wù)器活動(dòng)的連續記錄。SQL Server Profiler允許您監控SQL Server產(chǎn)生的事件,過(guò)濾基于用戶(hù)指定標準的事件,或將操作步驟輸出到屏幕、文件或數據表。運用SQL Server Profiler,您可以重新執行所捕獲的上一次操作。這種工具可以幫助應用程序開(kāi)發(fā)者識別那些可能會(huì )降低應用程序性能的事務(wù)處理。在將一個(gè)基于文件體系結構的應用程序移植到客戶(hù)/服務(wù)器結構中時(shí)該特性是很有用的,因為它的最后一步包括對面向新的客戶(hù)/服務(wù)器環(huán)境的應用程序進(jìn)行優(yōu)化。
轉移表和數據
使用DTS Wizard將您的Access數據轉移到SQL Server,可采取以下步驟:
在 SQL Server Manager(Enterprise Manager)的工具菜單中,鼠標指向“Data Transformation Services”, 然后點(diǎn)擊“Import Data.”
在“選擇數據源”( Choose a Data Source)的對話(huà)窗口中,選擇Microsoft Access為數據源,然后輸入您的.mdb文件名(mdb為文件擴展名)或者選擇瀏覽文件。
在“選擇數據目標”(Choose a Destination)的對話(huà)窗口中,選擇“Microsoft OLE DB Provider for SQL Server”,再選擇好數據庫服務(wù)器,然后點(diǎn)擊所需的認證模式。
在“指定表備份或查詢(xún)”( Specify Table Copy or Query)的對話(huà)窗口中,點(diǎn)擊“拷貝表”(Copy tables)。
在“選擇數據源”的對話(huà)窗口中,點(diǎn)擊“選擇所有項”( Select All)。
移植Microsoft Access查詢(xún)
您可以將Access的查詢(xún)以下面的格式之一轉移至SQL Server中:
事務(wù)處理SQL腳本程序(Transact-SQL s cripts )
事務(wù)處理SQL語(yǔ)句通常是由數據庫程序調用的,但是您也可以使用SQL Server 7.0中包含的SQL Server 查詢(xún)分析器直接運行它們。SQL Server 查詢(xún)分析器可幫助開(kāi)發(fā)者測試事務(wù)處理SQL語(yǔ)句,或運行那些執行查詢(xún)處理、數據操作(插入,修改,刪除)和數據定義(創(chuàng )建表)的事務(wù)處理SQL語(yǔ)句。
存儲過(guò)程(Stored procedures )
開(kāi)發(fā)者可以將大部分產(chǎn)生自Access查詢(xún)(查找,插入,修改,刪除)的事務(wù)處理SQL語(yǔ)句轉移至存儲過(guò)程。用事務(wù)處理SQL語(yǔ)句書(shū)寫(xiě)的存儲過(guò)程可以用來(lái)對您的數據存取打包,并使之標準化,而且存儲過(guò)程實(shí)際上是存儲在數據庫中的。存儲過(guò)程可以帶參數,也可不帶參數,可以由數據庫程序調用或者由SQL Server查詢(xún)分析器手動(dòng)執行。
視圖(Views )
視圖是從一個(gè)或多個(gè)表中顯示特定的行和列的虛擬表。它們允許用戶(hù)可以不直接執行構成查詢(xún)基礎的復雜連接而建立查詢(xún)。視圖不支持參數的使用。連接多個(gè)數據表的視圖不能用INSERT, UPDATE或 DELETE語(yǔ)句來(lái)修改。視圖由事務(wù)處理SQL語(yǔ)句調用,也可用于SQL Server查詢(xún)分析器中運行的程序段。SQL Server視圖和SQL-92標準不支持視圖中的ORDER BY排序子句。如欲了解事務(wù)處理SQL,存儲過(guò)程和視圖的其他信息,請參閱SQL Server 在線(xiàn)參考書(shū)。
Access查詢(xún)類(lèi)型的SQL Server移植選擇與建議
一個(gè)SELECT語(yǔ)句可以存儲在事務(wù)處理SQL文件、存儲過(guò)程或是視圖中。建立存儲過(guò)程是將數據庫應用開(kāi)發(fā)與數據庫設計的物理實(shí)施分開(kāi)的最佳方法。存儲過(guò)程可在一處創(chuàng )建而由應用程序調用。
如果存儲過(guò)程所基于的數據庫變化了,而存儲過(guò)程經(jīng)過(guò)仔細的修改以反應這些變化,則對存儲過(guò)程的調用將不會(huì )受到破壞。
交叉表(CROSSTAB)
交叉表經(jīng)常用于總結報表。
一個(gè)Access的交叉表可以通過(guò)SQL程序段、存儲過(guò)程或視圖中的事務(wù)處理SQL語(yǔ)句來(lái)執行。每當發(fā)出一個(gè)查詢(xún)時(shí),數據連接被重現執行以確保最近的數據得到使用。
根據實(shí)際應用情況,比較合適的方法是將交叉表中的數據存儲為一個(gè)臨時(shí)表(參考下面的MAKE TABLE),臨時(shí)表對資源的需求比較少,但是臨時(shí)表在建立的同時(shí)只提供對數據的一個(gè)快照(snapshot)。
創(chuàng )建表(MAKE TABLE)
Access中的“MAKE TABLE”( 創(chuàng )建表)可以通過(guò)事務(wù)處理SQL腳本程序或存儲過(guò)程中的事務(wù)處理SQL語(yǔ)言的建表語(yǔ)句“CREATE TABLE”來(lái)執行。語(yǔ)法如下所示:
SELECT [ ALL | DISTINCT ]
[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]
<select_list>
[ INTO new_table ]
[ FROM {<table_source>} [,…n] ]
[ WHERE <search_condition> ]
[ GROUP BY [ALL] group_by_expression [,…n]
[ WITH { CUBE | ROLLUP } ]
CREATE TABLE mytable (low int, high int)
UPDATE(修改)
UPDATE語(yǔ)句可以存儲在事務(wù)_SQL腳本程序中,然而比較好地執行UPDATE語(yǔ)句的方法是創(chuàng )建一個(gè)存儲過(guò)程。
APPEND(添加)
ALLEND語(yǔ)句可以存儲在事務(wù)_SQL腳本程序中,然而比較好地執行APPEND語(yǔ)句的方法是創(chuàng )建一個(gè)存儲過(guò)程。
移植Microsoft Access的查詢(xún)到存儲過(guò)程和視圖
每個(gè)Access查詢(xún)都必須用以下的一系列語(yǔ)句替換:
CREATE PROCEDURE <NAME_HERE> AS
< SELECT, UPDATE, DELETE, INSERT, CREATE TABLE statement from Microsoft Access >
GO
CREATE VIEW <NAME_HERE> AS
<Place (SELECT only, with no parameters) Microsoft Access Query>
GO
對每個(gè)Access查詢(xún)應執行:
打開(kāi)Access,然后在SQL Server中,打開(kāi)SQL Server查詢(xún)分析器。
在A(yíng)ccess的數據庫窗口中點(diǎn)擊“Queries”tab鍵,然后點(diǎn)擊“Design”按鈕。
在“View”菜單上點(diǎn)擊“SQL”按鈕。
將整個(gè)查詢(xún)粘貼到SQL Server查詢(xún)分析器中。
測試語(yǔ)法,保存事務(wù)處理SQL語(yǔ)句以備后用,或者在數據庫中執行這些語(yǔ)句。您可以選擇將事務(wù)處理SQL語(yǔ)句保存到一段腳本程序中。
移植Microsoft Access查詢(xún)到事務(wù)處理SQL語(yǔ)句
大部分的Access查詢(xún)應該轉換成存儲過(guò)程和視圖。然而,有一些應用程序開(kāi)發(fā)者不太常用的語(yǔ)句可以存儲為事務(wù)處理SQL腳本,一種以sql為文件擴展名的文本文件。 這些文件可以在SQL Server查詢(xún)分析器中運行。
如果您打算將一些Access查詢(xún)轉換為sql文件的話(huà),可以考慮根據它們使用的方式有區別地將這些事務(wù)處理SQL語(yǔ)句分別放在幾個(gè)腳本程序中。例如,您可以將必須以同樣頻率運行的事務(wù)處理SQL語(yǔ)句歸類(lèi)到同一個(gè)腳本中。另一個(gè)腳本中則應包含所有只在某些條件下運行的事務(wù)處理SQL語(yǔ)句。此外,必須以一定順序執行的事務(wù)處理SQL語(yǔ)句應當歸類(lèi)到一個(gè)不連續的腳本中。
將Access語(yǔ)句轉移到事務(wù)處理SQL 文件
將語(yǔ)句拷貝到SQL Server查詢(xún)分析器中
使用藍色的多選項圖標分析語(yǔ)句
在適當時(shí)候執行該語(yǔ)句
要執行Access中的創(chuàng )建表(MAKE TABLE)的查詢(xún)任務(wù)的開(kāi)發(fā)者在SQL Server中有幾種選擇。開(kāi)發(fā)者可創(chuàng )建下列對象之一:
一個(gè)視圖
視圖具有動(dòng)態(tài)的虛擬表的效果,可提供最近的信息。這是一個(gè)輸入/輸出強化器,因為每當發(fā)出一個(gè)查詢(xún)時(shí)它都要求對數據表重現建立連接。
一個(gè)臨時(shí)表
臨時(shí)表為已連接的用戶(hù)會(huì )話(huà)建立一個(gè)快照。您可以建立局部的或全局的臨時(shí)表。局部臨時(shí)表只在當前會(huì )話(huà)中可見(jiàn),而全局臨時(shí)表則在所有會(huì )話(huà)都是可見(jiàn)的。在局部臨時(shí)表的名字前加上單個(gè)數字的前綴((#table_name)),而在全局臨時(shí)表的名字前加上兩位數字的前綴(##table_name)。對臨時(shí)表的查詢(xún)執行起來(lái)非???,因為它們取得一個(gè)結果集的時(shí)候通常只用一個(gè)表,而不是將多個(gè)表動(dòng)態(tài)地連接在一起來(lái)。
如欲了解臨時(shí)表的其他信息,請參閱SQL Server在線(xiàn)參考書(shū)。
SQL Server 7.0中的數據轉換服務(wù)(DTS)允許您通過(guò)創(chuàng )建包來(lái)實(shí)現臨時(shí)表建立的標準化、自動(dòng)化和進(jìn)度安排。例如,當您移植Access 2.0中的Northwind 范例數據庫時(shí),用于季度數據報表的交叉表可轉變?yōu)橐粋€(gè)視圖或者一個(gè)可在規范基礎上建立臨時(shí)表的數據轉換。如欲了解關(guān)于DTS的其他信息,請參閱SQL Server在線(xiàn)參考書(shū)。
其他設計上的考慮
下面是當您將您的Access應用移植到SQL Server時(shí)必須考慮的一些其他問(wèn)題:
使用參數
帶參數的SQL Server存儲過(guò)程需要一種不同于A(yíng)ccess查詢(xún)的語(yǔ)法格式,例如:
Access 2.0格式:
查詢(xún)名:Employee Sales By Country, in NWIND.mdb:
PARAMETERS [Beginning Date] DateTime, [Ending Date] DateTime;
SELECT Orders.[Order ID], [Last Name] & ", " & [First Name] AS Salesperson, Employees.Country, Orders.[Shipped Date], [Order Subtotals].Subtotal AS [Sale Amount]
FROM Employees INNER JOIN (Orders INNER JOIN [Order Subtotals] ON Orders.[Order ID] = [Order Subtotals].[Order ID]) ON Employees. = Orders.
WHERE (((Orders.[Shipped Date]) Between [Beginning Date] And [Ending Date]))
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 Salesperson, Employees.Country,
Orders.[Shipped Date], [Order Subtotals].Subtotal AS [Sale Amount]
FROM Employees INNER JOIN (Orders INNER J