通过 SQL Server 进行 Access 导览

通过 SQL Server 进行 Access 导览

将数据从 Access 迁移到 SQL Server 后,现在有了一个客户端/服务器数据库,这可能是本地或混合 Azure 云解决方案。 无论采用哪种方法,Access 现在都是表示层,而 SQL Server 则是数据层。 现在是重新思考该解决方案各个方面的好时机,尤其是查询性能、安全性和业务连续性方面,从而可以改进和扩展你的数据库解决方案。

本地和云中的 Access

第一次接触 SQL Server 和 Azure 文档的 Access 用户可能会感到望而生畏。 因此需要一份引导指南带你了解对你而言很重要的重点内容。 完成此导览后,你将准备好探索数据库技术取得的进步,并踏上更长远的发现之旅。

本文内容

数据库管理

促进业务连续性

SQL Server 安全性

处理隐私问题

创建数据库快照

并发控制

查询和相关

提高查询性能

查询方式

添加键和索引

执行事务

使用约束和触发器

数据类型

使用计算列

为数据添加时间戳

管理大型对象

杂项

使用分层数据

操作 JSON 文本



资源

促进业务连续性

对于你的 Access 解决方案,你希望以最小的中断保持正常运行,但是使用 Access 后端数据库时的选项很有限。 备份 Access 数据库对保护数据非常重要,但需要让用户脱机。 另外,硬件/软件维护升级、网络或电源中断、硬件故障、安全漏洞甚至网络攻击可能造成计划外停机。 为了尽量缩短停机时间和对业务的影响,可备份正在使用中的 SQL Server 数据库。 此外,SQL Server 还提供了高可用性 (HA) 和灾难恢复 (DR) 策略。 这两种技术整合在一起称为“HADR”。 有关详细信息,请参阅业务连续性和数据库恢复以及使用 SQL Server 促进业务连续性(电子书)

在使用中备份

SQL Server 使用可在数据库运行时进行的联机备份过程。 可执行完整备份、部分备份或文件备份。 备份将复制数据和事务日志,以确保执行完整的还原操作。 尤其在本地解决方案中,请注意简单和完整恢复选项之间的差异以及它们对事务日志增长有何影响。 有关详细信息,请参阅恢复模型

大多数备份操作都将立即执行,但文件管理和收缩数据库操作除外。 相反,如果在执行备份操作的过程中尝试创建或删除数据库文件,则该操作将失败。 有关详细信息,请参阅备份概述

HADR

实现高可用性和业务连续性的两种最常见技术是镜像和群集。 SQL Server 将镜像和群集技术与“AlwaysOn 故障转移群集实例”和“AlwaysOn 可用性组”相集成。

镜像是一种数据库级别的连续性解决方案,可通过维护备用数据库(即独立硬件上活动数据库的完整复制或镜像)支持近乎即时的故障转移。 此方案可以采用同步(高安全性)工作模式,这种情况下传入的事务同时提交到所有服务器,也可以采用异步(高性能)模式,这种情况下传入的事务提交到活动数据库,然后在某个预定点复制到镜像。 镜像是数据库级别的解决方案,仅适用于使用完整恢复模型的数据库。

群集是服务器级别的解决方案,可将服务器合并到单个数据存储中,从而向用户显示单一实例。 用户将连接到该实例,不需要知道实例中当前哪个服务器处于活动状态。 如果一台服务器发生故障或需要脱机维护,用户体验不会发生变化。 群集中的每个服务器都由群集管理器使用检测信号进行监视,因此会检测群集中的活动服务器何时脱机,并尝试无缝切换到群集中的下一个服务器,但在进行切换时会有不同程度的时间延迟。

有关详细信息,请参阅 AlwaysOn 故障转移群集实例AlwaysOn 可用性组:高可用性和灾难恢复解决方案

返回页首

SQL Server 安全性

虽然可以使用信任中心和通过加密数据库来保护 Access 数据库,但 SQL Server 具有更高级的安全功能。 我们来看看面向 Access 用户的三种重要功能。 有关详细信息,请参阅保护 SQL Server

数据库身份验证

SQL Server 中有四种数据库身份验证方法,每种方法都可在 ODBC 连接字符串中予以指定。 有关详细信息,请参阅链接到数据或从 Azure SQL Server 数据库导入数据。 每种方法均有其自身优势。

集成 Windows 身份验证    使用 Windows 凭据进行用户验证、设置安全角色以及将用户限定到特定功能和数据。 可利用域凭据并轻松管理应用程序中的用户权限。 也可输入服务主体名称 (SPN)。 有关详细信息,请参阅选择身份验证模式

SQL Server 身份验证    用户第一次在会话中访问数据库时需要输入登录 ID 和密码,使用在数据库中设置的凭据进行连接。 有关详细信息,请参阅选择身份验证模式

Azure Active Directory 集成身份验证    使用 Azure Active Directory 连接到 Azure SQL Server 数据库。 配置 Azure Active Directory 身份验证后,无需其他登录名和密码。 有关详细信息,请参阅使用 Azure Active Directory 身份验证连接到 SQL 数据库

Active Directory 密码身份验证    输入登录名和密码,使用在 Azure Active Directory 中设置的凭据进行连接。 有关详细信息,请参阅使用 Azure Active Directory 身份验证连接到 SQL 数据库

提示    使用“威胁检测”在出现异常数据库活动时接收警报,提示对 Azure SQL Server 数据库的潜在安全威胁。 有关详细信息,请参阅 SQL 数据库威胁检测

应用程序安全性

SQL Server 具有两个应用程序级别安全功能,在使用 Access 时可利用这些功能。

动态数据掩码    通过向非特权用户显示掩码来隐藏敏感信息。 例如,可使社会安全号码显示部分或完整掩码。

部分数据掩码

部分数据掩码

完整数据掩码

完整数据掩码

可通过多种方法定义数据掩码,并可将其应用于不同的数据类型。 数据掩码是针对事先定义的一组用户在表和列级别实施的策略驱动型安全机制,可实时应用于查询。 有关详细信息,请参阅动态数据掩码

行级别安全性    通过使用行级别安全性,可根据用户特征来控制对含有敏感信息的特定数据库行的访问。 数据库系统应用这些访问限制后,将增强安全系统的可靠性和健壮性。

SQL Server 行安全性

有两种类型的安全谓词:

  • 筛选谓词可筛选查询中的行。 筛选是透明的,最终用户不知道任何筛选。

  • 阻止谓词可防止未经授权的操作,如果无法执行该操作,将引发异常。

有关详细信息,请参阅行级别安全性

通过加密保护数据

在不影响数据库性能的情况下,保护静态数据、传输中的数据以及使用中的数据。 有关详细信息,请参阅 SQL Server 加密

静态数据加密    若要在物理存储层保护个人数据免受脱机媒体攻击,请使用静态加密,也称为透明数据加密 (TDE)。 这意味着即使物理媒体被盗或处置不当,你的数据也会受到保护。 TDE 执行数据库、备份数据和事务日志的实时加密和解密,无需对应用程序进行任何更改。

传输中的数据加密    若要防止侦听和“中间人攻击”,可加密通过网络传输的数据。 SQL Server 支持用于高度安全通信的传输层安全性 (TLS) 1.2。 还使用表格格式数据流 (TDS) 协议来保护不受信任的网络上的通信。

客户端使用中的数据加密    若要保护使用中的个人数据,“Always Encrypted”是你需要的功能。 个人数据由客户端计算机上的驱动程序加密和解密,而不会将加密密钥泄漏到数据库引擎。 因此,只有负责管理这些数据的人员可以看到加密的数据,其他不应具有访问权限的用户则不能。 根据所选的加密类型,Always Encrypted 可能会限制对加密列进行搜索、分组和索引等某些数据库功能。

返回页首

处理隐私问题

由于隐私问题非常普遍,欧盟已通过一般数据保护条例 (GDPR) 明确了法律要求。 幸运的是,SQL Server 后端非常适合应对这些要求。 可考虑在三步框架中实施 GDPR。

GDPR 是包含三个步骤的过程

步骤 1:评估和管理合规性风险

GDPR 要求你识别并清点表格和文件中的个人信息。 这些信息可以是以下任何内容:姓名、照片、电子邮件地址、银行详细信息、社交网络网站上的帖子、医学信息甚至 IP 地址。

内置于 SQL Server Management Studio 中的一种新工具 SQL 数据发现和分类可帮助你通过对列应用以下两个元数据属性来发现、分类、标记和报告敏感数据:

  • 标签    定义数据的敏感度。

  • 信息类型    提供有关存储在列中的数据类型的更多粒度。

另一种可使用的发现机制是全文搜索,这种机制包括使用 CONTAINS 和 FREETEXT 谓词以及诸如 CONTAINSTABLE 和 FREETEXTTABLE 之类的行集值函数(与 SELECT 语句结合使用)。 通过使用全文搜索,可搜索表格来发现字词、字词组合或字词的变体(如同义词或屈折形式)。 有关详细信息,请参阅全文搜索

步骤 2:保护个人信息

GDPR 要求你保护个人信息并限制对个人信息的访问。 除了管理网络和资源访问权限所需执行的标准步骤(如防火墙设置),还可使用 SQL Server 安全功能来帮助控制数据访问:

  • SQL Server 身份验证,可管理用户标识和防止未经授权访问。

  • 行级别安全性,可根据用户和该数据之间的关系限制对表中的行的访问。

  • 动态数据掩码,可通过向非特权用户显示掩码来限制个人数据的暴露。

  • 加密,可确保个人数据在传输和存储过程中受到保护以免受到损害,包括服务器端的安全保护。

有关详细信息,请参阅 SQL Server 安全性

步骤 3:高效地响应请求

GDPR 要求你保留个人数据处理记录,并能根据要求将这些记录提供给监管机构。 如果发生的问题(包括意外数据外泄),保护控制机制可让你快速做出响应。 在需要报告时,数据必须快速可用。 例如,GDPR 要求“已意识到个人数据泄露后不晚于 72 小时”向监管机构报告该问题。

SQL Server 2017 可通过以下几种方式帮助你执行报告任务:

  • SQL Server 审核可帮助你确保存在数据库访问和处理活动的持久记录。 它执行细化审核以跟踪数据库活动,帮助你了解并识别可能存在的威胁、可疑的滥用问题或违反安全性的情况。 你可以轻松执行数据取证。

  • SQL Server 时态表是系统版本的用户表,旨在保留数据更改的完整历史记录。 可使用这些表轻松进行报告和时间点分析。

  • SQL 漏洞评估可帮助你检测安全和权限问题。 检测到问题时,还可向下钻取到数据库扫描报告,查找解决问题的操作。

有关详细信息,请参阅创建信任平台(电子书)GDPR 合规性之旅

返回页首

创建数据库快照

数据库快照是 SQL Server 数据库在某一时间点的只读静态视图。 虽然可以通过复制 Access 数据库文件来有效创建数据库快照,但 Access 不像 SQL Server 那样有内置的方法。 你可以使用数据库快照根据创建数据库快照时的数据编写报表。 还可以使用数据库快照来维护历史记录数据,如用于累积周期结束报表的每财务季度快照。 建议采用以下最佳做法:

  • 对快照命名    每个数据库快照都需要唯一的数据库名称。 将用途和时间范围添加到名称中以便于识别。 例如,若要使用 24 小时制在每天上午 6 点到下午 6 点之间以 6 小时为时间间隔创建三次 AdventureWorks 数据库快照,请将这些快照命名为 entureWorks_snapshot_0600、AdventureWorks_snapshot_1200 和 AdventureWorks_snapshot_1800。

  • 限制快照数    每个数据库快照将持久保留,直至将其显式丢弃为止。 由于每个快照将持续增长,因此可能需要在创建新的快照后删除较旧的快照来节省磁盘空间。 例如,如果要创建日常报告,请将数据库快照保留 24 小时,然后将其丢弃并替换为新报告。

  • 连接到正确的快照    为了使用数据库快照,Access 前端需要知道正确的位置。 替换现有的快照时,你需要将 Access 重定向到新的快照。 应向 Access 前端添加逻辑,确保连接到正确的数据库快照。

下面介绍了如何创建数据库快照:

CREATE DATABASE AdventureWorks_dbss1800 ON  
( NAME = AdventureWorks_Data, FILENAME =   
'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks_snapshot_0600' )  
AS SNAPSHOT OF AdventureWorks;  

有关详细信息,请参阅数据库快照 (SQL Server)

返回页首

并发控制

当许多用户尝试同时修改数据库中的数据时,需要有一个控制系统,确保一个用户所做的更改不会对另一个用户的更改造成不利影响。 这种机制称为“并发控制”,并有两种基本锁定策略:悲观和乐观。 锁定功能可防止用户在修改数据时影响其他用户。 锁定还有助于确保数据库完整性,尤其是对于可能会产生意外结果的查询。 Access 和 SQL Server 在实现这些并发控制策略的方式上有着重要的差异。

在 Access 中,默认的锁定策略是乐观策略,并将锁的所有权授予第一个尝试写入记录的用户。 Access 会向尝试同时写入同一记录的其他用户显示“写入冲突”对话框。 为了解决该冲突,其他用户可以保存该记录,将其复制到剪贴板,或丢弃所做的更改。

你还可以使用 RecordLocks 属性来更改并发控制策略。 此属性会影响窗体、报表和查询,并具有三种设置:

  • 不锁定    在窗体中,多个用户可同时尝试编辑同一条记录,但可能会出现“写入冲突”对话框。 在报表中,预览或打印报表时不会锁定记录。 在查询中,运行查询时不会锁定记录。 这是 Access 实现乐观锁定的方式。

  • 所有记录    在“窗体”视图或“数据表”视图中打开窗体时,预览或打印报表时,或者运行查询时,基础表或查询中的所有记录均处于锁定状态。 用户可在锁定期间读取记录。

  • 已编辑的记录    对于窗体和查询,只要任何用户开始编辑记录中的任何字段,一页的记录都将被锁定,直到用户移到另一记录后才会解除锁定。 因此,每次仅有一个用户可以编辑记录。 这是 Access 实现悲观锁定的方式。

有关详细信息,请参阅“写入冲突”对话框RecordLocks 属性

在 SQL Server 中,并发控制的工作方式如下:

  • 悲观    用户执行导致运用锁定的操作后,在所有者解除锁定之前,其他用户无法执行将会与锁定发生冲突的操作。 此并发控制主要用于发生大量数据争用的环境。

  • 乐观    在乐观并发控制中,用户在读取数据时不锁定数据。 用户更新数据时,系统会检查是否在读取数据后有其他用户更改了数据。 如果其他用户更新了数据,将引发错误。 通常情况下,收到错误的用户将回退事务并重新开始。 此并发控制主要用于发生少量数据争用的环境。

你可以通过选择多个事务隔离级别来指定并发控制的类型,这些隔离级别使用 SET TRANSACTION 语句来定义防止其他事务对事务进行修改的保护级别:

 SET TRANSACTION ISOLATION LEVEL
 { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ  
    | SNAPSHOT
    | SERIALIZABLE
 }

隔离级别

说明

未提交的读取

对事务进行的隔离仅限于确保不读取物理损坏的数据。

已提交的读取

事务可以读取先前由另一个事务读取的数据,无需等待第一个事务完成。

可重复的读取

在事务结束之前所选数据将发生读/写锁定,但可能发生虚拟读取。

快照

使用行版本提供事务级别的读取一致性。

可序列化

事务之间完全相互隔离。

有关详细信息,请参阅事务锁定和行版本控制指南

返回页首

提高查询性能

一旦进行 Access 传递查询,便可利用 SQL Server 能使其更高效运行的复杂方法。

与 Access 数据库不同,对于拥有多个微处理器 (CPU) 的计算机,SQL Server 提供并行查询来优化查询执行和索引操作。 由于 SQL Server 可使用多个系统工作线程并行执行查询或索引操作,因此可快速高效地完成操作。

查询是提高数据库解决方案整体性能的一个重要组成部分。 不良查询将无限期运行、超时以及耗尽资源(如 CPU、内存和网络带宽)。 这将降低关键业务信息的可用性。 即使是一次不良查询也可能导致数据库出现严重的性能问题。

有关详细信息,请参阅使用 SQL Server 提高查询速度(电子书)

查询优化

以下多个工具可协同工作,帮助你分析查询性能并实施改进:查询优化器、执行计划和查询存储。

查询优化的工作方式

查询优化器

查询优化器是 SQL Server 最重要的组件之一。 使用查询优化器可以分析查询并确定如何最高效地访问所需数据。 查询优化器的输入包括查询、数据库架构(表和索引定义)和数据库统计信息。 查询优化器的输出是一个执行计划。

有关详细信息,请参阅 SQL Server 查询优化器

执行计划

执行计划是对要访问的源表进行排序的定义,以及用于从每个表中提取数据的方法。 优化是从潜在的大量可能计划中选择一个执行计划的过程。 每个可能的执行计划都具有以所使用的计算资源量表示的关联成本,而查询优化器将选择估计成本最低的一个执行计划。

SQL Server 还必须动态调整以适应数据库中不断变化的条件。 查询执行计划中的回归会显著影响性能。 数据库中的某些更改可能会导致执行计划效率低下或无效,具体取决于数据库的新状态。 SQL Server 会检测使执行计划无效的更改,并将该计划标记为无效。

然后必须针对执行查询的下一个连接重新编译一个新计划。 使计划无效的条件包括:

  • 对查询引用的表或视图进行更改(ALTER TABLE 和 ALTER VIEW)。

  • 对执行计划所使用的索引进行更改。

  • 对执行计划所使用的统计信息进行更新(从 UPDATE STATISTICS 之类的语句或自动显式生成)。

有关详细信息,请参阅执行计划

查询存储

查询存储可提供有关执行计划选择和性能的见解。 此工具帮助你快速发现由执行计划更改导致的性能差异,可简化性能故障排除。 查询存储会收集遥测数据,如查询历史记录、计划、运行时统计信息和等待统计信息。 使用 ALTER DATABASE 语句可实现查询存储:

ALTER DATABASE AdventureWorks2012 SET QUERY_STORE = ON;

有关详细信息,请参阅使用查询存储监视性能

自动计划更正

提高查询性能的最简单方法可能是使用自动计划更正,这是 Azure SQL 数据库可用的一项功能。 只需启用该功能即可正常工作。 它持续对执行计划进行监视和分析,检测有问题的执行计划,并自动修复性能问题。 在后台,自动计划更正功能使用四步(了解、调整、验证和重复)策略。

有关详细信息,请参阅自动优化

自适应查询处理

还可以仅通过升级到 SQL Server 2017(该版本具有称为自适应查询处理的新功能)来实现更快的查询。 SQL Server 根据运行时特征来调整查询计划的选择。

基数估计功能将估算执行计划中每个步骤所处理的行数。 不准确的估计可能导致查询响应时间变慢、不必要的资源利用(内存、CPU 和 IO)以及吞吐量和并发性降低。 根据应用程序工作负载特征,可使用三种技术:

  • 批处理模式内存授予反馈    不良的基数估计可能导致查询“溢出到磁盘”或占用太多内存。 SQL Server 2017 根据执行反馈来调整内存授予,消除溢出到磁盘问题,并改进重复查询的并发性。

  • 批处理模式自适应联接   自适应联接在运行时根据实际的输入行,动态选择更好的内部联接类型(嵌套循环联接、合并联接或哈希联接)。 因此,一个计划可以在执行过程中动态切换到更好的联接策略。

  • 交错执行    传统上,多语句表值函数被查询处理视为黑盒。 SQL Server 2017 可以更好地估算行数,以便改进下游操作。

通过为数据库启用兼容级别 140,可以使工作负载自动符合自适应查询处理的条件:

ALTER DATABASE [YourDatabaseName] SET COMPATIBILITY_LEVEL = 140;

有关详细信息,请参阅 SQL 数据库中的智能查询处理

返回页首

查询方式

在 SQL Server 中,有多种查询方法,它们各有各的优势。 你需要了解这些方法,以便为你的 Access 解决方案做出正确的选择。 创建 TSQL 查询的最佳方式是使用 SQL Server Management Studio (SSMS) Transact-SQL 编辑器以交互方式编辑和测试这些查询;这种编辑器具有智能感知功能,可帮助你选择正确的关键字并检查是否有语法错误。

视图

在 SQL Server 中,视图类似于一个虚拟表,其中的视图数据来自一个或多个表或其他视图。 但是,对视图的引用方式非常类似于查询中的表。 视图可通过限制行集和列集来隐藏查询的复杂性并帮助保护数据。 下面是一个简单视图的示例:

CREATE VIEW HumanResources.EmployeeHireDate AS  
SELECT p.FirstName, p.LastName, e.HireDate  
FROM HumanResources.Employee AS e JOIN Person.Person AS p  
ON e.BusinessEntityID = p.BusinessEntityID;

为获得最佳性能以及编辑视图结果,请创建一个索引视图,该视图会像表一样在数据库中持久存在,会为其分配存储,并可以像任何表一样对其进行查询。 若要在 Access 中使用索引视图,请按照链接到表的相同方式链接到视图。 下面是一个索引视图的示例:

CREATE VIEW Sales.vOrders  
WITH SCHEMABINDING  
AS  
    SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue,  
        OrderDate, ProductID, COUNT_BIG(*) AS COUNT  
    FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o  
    WHERE od.SalesOrderID = o.SalesOrderID  
    GROUP BY OrderDate, ProductID;  

CREATE UNIQUE CLUSTERED INDEX IDX_V1   
    ON Sales.vOrders (OrderDate, ProductID);  

但是有一些限制。 如果有多个基表受到影响,或者视图包含聚合函数或 DISTINCT 子句,则无法更新数据。 如果 SQL Server 返回错误消息,指出其不知道要删除哪个记录,那么你可能需要在视图上添加删除触发器。 最后,不能像在 Access 查询中一样使用 ORDER BY 子句。

有关详细信息,请参阅视图创建索引视图

存储过程

存储过程包含一条或多条 TSQL 语句,这些语句接受输入参数、返回输出参数并通过状态值指示成功或失败。 它们充当 Access 前端和 SQL Server 后端之间的中间层。 存储过程可以像 SELECT 语句一样简单,也可以像任何程序一样复杂。 下面是一个示例:

CREATE PROCEDURE HumanResources.uspGetEmployees   
    @LastName nvarchar(50),   
    @FirstName nvarchar(50)   
AS   
    SET NOCOUNT ON;  
    SELECT FirstName, LastName, Department  
    FROM HumanResources.vEmployeeDepartmentHistory  
    WHERE FirstName = @FirstName AND LastName = @LastName  
    AND EndDate IS NULL;  

在 Access 中使用存储过程时,它通常会将结果集返回到窗体或报表。 但是,它也可能执行不返回结果的其他操作,如 DDL 或 DML 语句。 使用传递查询时,请确保正确设置返回记录属性。

有关详细信息,请参阅存储过程

公用表表达式

公用表表达式 (CTE) 类似于可生成命名结果集的临时表。 它的存在只是为了执行单个查询或 DML 语句。 CTE 在 SELECT 语句或使用该 CTE 的 DML 语句所在的代码行中生成,而创建和使用临时表或视图的过程通常包含两步。 下面是一个示例:

-- Define the CTE expression name and column list.  
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)  
AS  
-- Define the CTE query.  
(  
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear  
    FROM Sales.SalesOrderHeader  
    WHERE SalesPersonID IS NOT NULL  
)  
-- Define the outer query referencing the CTE name.  
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear  
FROM Sales_CTE  
GROUP BY SalesYear, SalesPersonID  
ORDER BY SalesPersonID, SalesYear;

CTE 有多个优点,其中包括:

  • 由于 CTE 是瞬态的,因此无需将其创建为永久数据库对象(比如视图)。

  • 可在查询或 DML 语句中多次引用同一 CTE,使代码更易于管理。

  • 可使用引用 CTE 的查询来定义光标。

有关详细信息,请参阅 WITH common_table_expression

用户定义的函数

用户定义的函数 (UDF) 可执行查询和计算,并返回标量值或数据结果集。 它们类似于编程语言中的函数,能够接受参数,执行复杂计算等操作,并以值的形式返回该操作的结果。 下面是一个示例:

CREATE FUNCTION dbo.ISOweek (@DATE datetime)  
RETURNS int WITH SCHEMABINDING -- Helps improve performance
WITH EXECUTE AS CALLER  
AS  
BEGIN  
     DECLARE @ISOweek int;  
     SET @ISOweek= DATEPART(wk,@DATE)+1  
          -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104');  
-- Special cases: Jan 1-3 may belong to the previous year  
     IF (@ISOweek=0)   
          SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1   
               AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1;  
-- Special case: Dec 29-31 may belong to the next year  
     IF ((DATEPART(mm,@DATE)=12) AND   
          ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))  
          SET @ISOweek=1;  
     RETURN(@ISOweek);  
END;  
GO  
SET DATEFIRST 1;  
SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';  

UDF 有一定的限制。 例如,不能使用某些不确定性的系统函数、执行 DML 或 DDL 语句以及执行动态 SQL 查询。

有关详细信息,请参阅用户定义的函数

返回页首

添加键和索引

无论使用哪种数据库系统,键和索引都是密切相关的。

在 SQL Server 中,请确保为每个表创建主键并为每个相关表创建外键。 SQL Server 中与 Access 的“自动编号”数据类型等效的功能是 IDENTITY 属性,可将其用于创建键值。 将此属性应用于任意数字列之后,它将变为只读并由数据库系统维护。 将一条记录插入包含 IDENTITY 列的表中时,系统会自动将 IDENTITY 列的值递增 1(从 1 开始计数),但你可以使用参数控制这些值。

有关详细信息,请参阅 CREATE TABLE、IDENTITY(属性)

索引

与往常一样,选择索引是在查询速度和更新成本之间实现平衡的行为。 在 Access 中只有一种类型的索引,但在 SQL Server 中有 12 种。 幸运的是,可以使用查询优化器帮助你可靠地选择最高效的索引。 另外,在 Azure SQL 中,你可以使用自动索引管理,这是一种自动优化功能,可以建议你添加或删除索引。 与 Access 不同,你必须在 SQL Server 中为外键创建你自己的索引。 此外,还可以在索引视图上创建索引以提高查询性能。 索引视图的缺点是,在修改视图的基表中的数据时会增加开销,因为该视图也必须更新。 有关详细信息,请参阅 SQL Server 索引体系结构和设计指南以及索引

返回页首

执行事务

使用 Access 时,执行联机事务过程 (OLTP) 很困难,但使用 SQL Server 时则相对简单。 一个事务是单个工作单位,可在成功时提交所有数据更改,但在失败时回退更改。 事务必须具有四个属性,通常称为 ACID:

  • 原子性    一个事务必须是一个原子工作单位;要么执行所有数据修改,要么不执行任何数据修改。

  • 一致性    完成后,事务必须将所有数据保留为一致的状态。 这意味着应用所有数据完整性规则。

  • 隔离性    并发事务所做的更改与当前事务之间隔离。

  • 持续性    事务完成后,即使发生系统故障,更改也是永久性的。

事务用于确保数据完整性,如 ATM 现金提款或工资自动存款。 可执行显式、隐式或批处理范围的事务。 下面是两个 TSQL 示例:

-- Using an explicit transaction

BEGIN TRANSACTION;  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
COMMIT;  

-- the ROLLBACK statement rolls back the INSERT statement, but the created table still exists.

CREATE TABLE ValueTable (id int);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;

有关详细信息,请参阅事务

返回页首

使用约束和触发器

所有数据库都具有保持数据完整性的方法。

约束

在 Access 中,可通过外键-主键配对、级联更新和删除以及验证规则在表关系中确保引用完整性。 有关详细信息,请参阅表关系指南使用有效性规则限制数据输入

SQL Server 使用 UNIQUE 和 CHECK 约束,它们是在 SQL Server 表中确保数据完整性的数据库对象。 若要验证值在其他表中是否有效,请使用外键约束。 若要验证列中的值是否在特定范围内,请使用 CHECK 约束。 这些对象是你的第一道防线,旨在高效工作。 有关详细信息,请参阅 UNIQUE 约束和 CHECK 约束

触发器

Access 没有数据库触发器。 在 SQL Server 中,可以使用触发器来强制实施复杂的数据完整性规则以及在服务器上运行此业务逻辑。 数据库触发器是在数据库中发生特定操作时运行的存储过程。 触发器是触发并随后执行存储过程的事件,例如在表中添加或删除记录。 虽然 Access 数据库可在用户尝试更新或删除数据时确保引用完整性,但 SQL Server 具有一组复杂的触发器。 例如,你可以设定触发器来批量删除记录并确保数据完整性。 甚至可以向表和视图添加触发器。

有关详细信息,请参阅触发器 - DML触发器 - DDL设计 T-SQL 触发器

返回页首

使用计算列

在 Access 中,可通过将计算列添加到查询中并构建一个表达式来创建计算列,例如:

Extended Price: [Quantity] * [Unit Price]

在 SQL Server 中也有称为计算列的等效功能,它是不会以物理方式存储在表中的虚拟列(除非该列标记为 PERSISTED)。 与前一种计算列类似,后一种计算列也在表达式中使用其他列的数据。 若要创建计算列,请将其添加到表中。 例如:

CREATE TABLE dbo.Products   
(  
    ProductID int IDENTITY (1,1) NOT NULL  
  , QtyAvailable smallint  
  , UnitPrice money  
  , InventoryValue AS QtyAvailable * UnitPrice  
);  

有关详细信息,请参阅指定表中的计算列

返回页首

为数据添加时间戳

有时可以添加一个表字段,用于在创建记录时记录时间戳,以便记录数据输入。 在 Access 中,可以仅创建默认值为 =Now() 的日期列。 若要在 SQL Server 中记录日期或时间,请使用默认值为 SYSDATETIME()datetime2 数据类型。

注意    避免混淆 rowversion 和为数据添加时间戳 (timestamp)。 关键字 timestamp 与 SQL Server 中的 rowversion 是同义词,但你应该使用关键字 rowversion。 在 SQL Server 中,rowversion 是一种数据类型,可在数据库中公开自动生成的唯一二进制数字,通常用作版本标记表行机制。 但是,rowversion 数据类型只是递增的数字,不保留日期和时间,也不用于为行添加时间戳。

有关详细信息,请参阅 rowversion。 有关使用 rowversion 来尽量减少记录冲突的详细信息,请参阅将 Access 数据库迁移到 SQL Server

返回页首

管理大型对象

在 Access 中,可使用附件数据类型来管理非结构化数据(如文件、照片和图像)。 在 SQL Server 术语中,非结构化数据称为 Blob(二进制大型对象),可通过多种方式对其进行处理:

FILESTREAM    使用 varbinary(max) 数据类型可以将非结构化数据存储在文件系统上,而不是数据库上。 有关详细信息,请参阅使用 Transact-SQL 访问 FILESTREAM 数据

FileTable    将 Blob 存储在名为 FileTable 的特殊表中,并提供与 Windows 应用程序的兼容性,如同它们存储在文件系统中一样,不会对客户端应用程序进行任何更改。 FileTable 要求使用 FILESTREAM。 有关详细信息,请参阅 FileTable

远程 BLOB 存储 (RBS)    将二进制大型对象 (BLOB) 存储在商品存储解决方案中,而不是直接存储在服务器上。 这样将节省空间并减少硬件资源。 有关详细信息,请参阅二进制大型对象 (Blob) 数据

返回页首

使用分层数据

虽然关系数据库(如 Access)的灵活性非常高,但处理分层关系是一个例外,通常需要复杂的 SQL 语句或代码。 分层数据示例包括:组织结构、文件系统、语言术语分类以及网页之间的链接图。 SQL Server 具有内置的 hierarchyid 数据类型和分层函数集,可轻松存储、查询和管理分层数据。

典型的层次结构

有关详细信息,请参阅分层数据教程:使用 hierarchyid 数据类型

返回页首

操作 JSON 文本

JavaScript 对象表示法 (JSON) 是一种 Web 服务,使用可人工读取的文本以属性–值对的形式在异步浏览器-服务器通信中传输数据。 例如:

{
"firstName": "Mary",
"lastName": "Contrary",
"spouse": null,
"age": 27
}

Access 没有任何内置方法可管理 JSON 数据,但在 SQL Server 中可以顺利地对 JSON 数据执行存储、索引、查询和提取操作。 你可以对 JSON 文本进行转换并存储到表中,或将数据的格式设置为 JSON 文本。 例如,对于 Web 应用,你可能希望将查询结果的格式设置 JSON,或将 JSON 数据结构添加到行和列中。

注意    在 VBA 中不支持 JSON。 一种替代方案是可以通过使用 MSXML 库在 VBA 中使用 XML。

有关详细信息,请参阅 SQL Server 中的 JSON 数据

返回页首

资源

现在是了解有关 SQL Server 和 Transact SQL (TSQL) 的详细信息的好时机。 正如你所见,有许多功能与 Access 相似,但也有些 Access 所没有的功能。 为了让你的学习之旅更上一层楼,请参考下面提供的一些学习资源:

资源

说明

使用 Transact-SQL 进行查询

基于视频的课程

数据库引擎教程

SQL Server 2017 相关教程

Microsoft Learn

Azure 实践学习

SQL Server 培训和认证

成为专家

SQL Server 2017

主登陆页面

SQL Server 文档

帮助信息

Azure SQL 数据库文档

帮助信息

云数据必备指南(电子书)

云概述

SQL Server 2017 数据表

新功能直观摘要

比较 Microsoft SQL Server 版本

按版本分类的功能摘要

Microsoft SQL Server Express 版本

下载 SQL Server Express 2017

SQL 示例数据库

下载示例数据库

返回页首

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×