SQL Server Express和MS Access的比较

22

我最近和一个同事聊天时,他告诉我SQL Express和MS Access本质上是一样的;但我认为这并不准确。我知道你可以将Access转换成SQL数据库,也许在内部它们很相似,但我认为SQL数据库引擎和运行Access所使用的引擎并不相同。此外,SQL语句的语法等也是不同的。

我主要想了解一下各个版本之间的区别,以便提高我的信息水平。

4个回答

48

嗯,不,不是一样的。

首先,我需要澄清一些术语。MS Access是一种快速应用程序开发(RAD)工具,允许您快速构建与关系数据绑定的表单和报告。它带有基于文件的数据库引擎(Jet/ACE)。

Access RAD工具可以与许多不同的后端数据库一起使用(Jet、SQL Server、任何支持ODBC的数据库等)。我必须假设您的同事特别是在评论Jet/ACE方面,即MS Access使用的数据库引擎。

我认为Jet/ACE数据库引擎MS SQL Server Express之间最大的区别在于Jet/ACE是基于文件的,而SQL Server Express使用客户端/服务器模型。这意味着SQL Server Express需要运行服务来提供对数据存储的访问。这可能会在某些情况下使部署变得复杂。

SQL Server Express实际上只是SQL Server的限制版本:最大数据库大小为4GB(在2008R2中为10GB),仅使用单个物理CPU等。这些限制是为了防止大型组织使用免费提供的Express版来代替完整的SQL Server安装。这样做的好处是,SQL Server Express提供了真正无缝升级到SQL Server的路径。它也(一般来说)是比Jet/ACE更强大和功能齐全的数据库管理系统。

相似之处

  • 关系数据库管理系统
  • 由Microsoft编写

区别

  • MS Access
    • 基于文件
    • 可自由分发的运行时(2007或更高版本)
    • RAD工具(表单/报告设计器)
    • 使用Jet SQL
    • 最大文件大小为2GB
  • SQL Server Express
    • 客户端/服务器模型
    • 免费
    • 没有RAD工具
    • 使用Transact-SQL
    • 最大数据库大小为4GB(SSE R2为10GB),最多一个物理CPU

5
值得注意的是,SQL Server 允许创建触发器和存储过程,而 Jet/ACE 则不行。MS Access 作为一种RAD工具,实际上并不适合编辑或执行存储过程,尽管您可以使用ADO(ActiveX数据对象)在VBA代码中操作它们。 - HK1
2
虽然我自己还没有机会使用它们,但Access 2010引入了“数据宏”,这类似于SQL Server中的触发器。 - mwolfe02
实际上,表级数据宏并不类似于触发器,但它们可以用于实现与触发器相同的功能。它们也可用于其他目的。 - David-W-Fenton

2

我认为你的同事所想的是SQL Server CE,它是一个超轻量级嵌入式数据库,在数据库管理方面仍然(在我看来)远远优于Access。SQL Express甚至不能与Access进行比较,否则会冒犯前者。


紧凑版的SQL Server没有存储过程或表触发器,而默认的Access数据引擎现在有了。因此,紧凑版的SQL Server并不像Access数据引擎(ACE)一样是一个进程内数据引擎,并且不是一个服务,这也是一个争议点。 - Albert D. Kallal
或者是SQLite vs Access。 - skan

0
请记住,如果你玩得好的话,使用MS-Access就没有大小限制。例如,没有理由不在每个数据库中单独包含许多2到4 GB的表。您的ODBC应用程序可以打开连接到多个MS-Access数据库,并查询每个单独的表。因此,您可以拥有包含数万亿条记录的数据库,存储在多个MDB文件中。我曾经为一家公司工作,他们使用单个MS-Access数据库来运行一个在MS-Access表单中完成的问题跟踪系统。由于共享问题会锁定MS-Access,他们只能一个人使用它。我编写了一个Win32 Perl本地Windows GUI用户界面,用于更好地进行字段/记录验证,我的ODBC代码能够管理同时用户访问的连接。我通过我的Perl程序管理每个用户对数据库的打开、读取、写入和关闭。我没有保持数据库处于打开状态。我没有为每个用户维护持久连接,而是仅维护足够长的连接时间以检索要编辑的记录。然后,我关闭连接,直到再次将记录写回数据库。此外,我通过维护一个用户登录表来编写自己的记录锁定程序逻辑,该表包含用户当前正在编辑的记录ID,然后在不再编辑该记录时删除该条目。当另一个用户尝试编辑相同的记录时,程序会检查该记录是否已由另一个用户打开进行编辑。该系统运行得非常完美。通过ODBC和多用户访问,MS-Access从未被锁定。我甚至将密码嵌入到我的编译Perl程序中,以便除了通过我的Perl程序之外,没有人可以访问Access数据库中的数据。

0

这里是两个产品的数据表,您可以看到这两个数据库之间的一些硬性差异。

Access: http://office.microsoft.com/en-us/access-help/access-specifications-HP005186808.aspx

SQL(Express在最右侧列中列出): http://www.microsoft.com/sqlserver/2008/en/us/editions-compare.aspx

我一直听到的评论是,Access非常适合单用户单访问数据库使用,一旦你超越了单个用户,请寻找其他解决方案。虽然这可能有点牵强,但Access在多用户环境下确实表现不佳。从经验上看,我们曾经有一个客户忽略了我们迁移后端数据库从Access到SQL的请求,我们不得不多次从备份中恢复,或者由于损坏而将Access数据库离线。

它们是两种完全不同的技术,面向两个不同的目标市场。数据库引擎确实不同,正如您提到的T-SQL与Access SQL不同。

您可以通过创建SSIS包或其他工具来“扩展”Access数据库以便迁移到SQL,但这需要将Access模式和数据迁移到真正的SQL数据库。它不仅仅是附加Access数据库之类的操作。

每当您需要一个“真正的”数据库时,我强烈建议查看可用于Access的任何SQL版本。


3
Access/Jet/ACE无法处理多个用户的观点是可笑的。我的所有Jet/ACE后端客户都有多个用户同时访问数据存储库。如果您的应用程序无法很好地处理多个用户,那是您的问题,而不是Access的问题。 - David-W-Fenton
3
不要使用“真实数据库”这个术语,这会让你看起来像一个一无所知的反Access偏执者。 - David-W-Fenton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接