关于日期,在Access和SQL Server之间都存在很大的差别。Access支持很大范围的日期,从100年1月1日到9999年12月31日。相反,SQL Server支持的日期从1753年1月1日到9999年12月31日。数据库的升级向导无法升级包含SQL Server不支持的日期的表格。这就意味着在升级之前你必须人工地处理这些日期。幸运的是,这一问题只影响少数的数据库。与表格控制相关的查询 开发人员通常会使用表格控制的查询来限制或询问一个数据来源。一个表格可以提供将数据显示在一个特定报告中的多种选择。例如,SQL SELECT语句包含了用户的输入:SELECT Orders.RequiredDate, Orders.ShippedDate, Orders.Freight, Orders.ShipName, Orders.ShipAddress, Orders.OrderDate FROM Orders WHERE Orders.OrderDate Between [Forms]![DateFilter]![DateFrom] And [Forms]![DateFilter]![DateTo]));为了限定报告中的数据,用户可以输入一个开始和结束的日期到列表(DateFrom 和DateTo)。其他的代码可以打开并显示满足用户输入的两个日期之间的记录。因为这种查询方式被Jet处理,表格中产生的问题可以很快被解决。然而,当数据库升级时,SQL Server不会涉及到表格控制,结果通常为查询失败。为了修正这一查询方式,开发人员必须更改表格。我建议你使用输入参数属性,并将数值传递到SQL Server存储程序。交叉表查询 SQL Server不支持Jet TRANSFORM语句──这一语句可以使一个交叉表查询成为可能。例如,数据库升级向导支持以下查询方式:TRANSFORM Sum(CCur([Order Details].UnitPrice*[Quantity]*(1-[Discount])/100)*100) AS ProductAmount SELECT Products.ProductName, Orders.CustomerID, Year([OrderDate]) AS OrderYear FROM Products INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID WHERE Orders.OrderDate Between #1/1/1997# And #12/31/1997# GROUP BY Products.ProductName, Orders.CustomerID, Year([OrderDate]) PIVOT "Qtr " DatePart("q",[OrderDate],1,0) In ("Qtr 1","Qtr 2","Qtr 3","Qtr 4")还好,你无需在SQL Server中使用Transact-SQL (T-SQL) CASE关键词重新编写一个Access的交叉表查询。下面的SELECT语句描述了使用T-SQL方式重新建立一个交叉表查询的语法:SELECT Customers.CustomerID, Customers.CustomerName SUM (Case When Orders.Orderdate BETWEEN '01-Jan-1990' AND '31-Dec-1996' Then [UnitPrice]*[Quantity] Else 0 End) as 1997) FROM Customers INNER JOIN Orders ON CustomerID=Orders.CustomerID隐藏对象 所有的隐藏对象在数据库升级过程中都被忽略。对此,你最好的处理方法是使用程序对象的GetHiddenAttribute属性检查对象。例如,以下代码使用这一方法决定对象是否被隐藏。 Dim IsHidden As Boolean If Application.GetHiddenAttribute(objtype, objname) Then IsHidden = True End If如果特定的对象被隐藏,IsHidden布尔变量将被为True。包含索引的表格