SQL Server CLR 集成简介
公共语言运行库 (CLR) 是 Microsoft .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境。在 CLR 中运行的代码称为托管代码。CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译、分配和管理内存、强制类型安全性、异常处理、线程管理和安全性。
通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合函数。因为托管代码在执行之前会编译为本机代码,所以,在有些方案中可以大大提高性能。
托管代码使用代码访问安全性 (CAS)、代码链接和应用程序域来阻止程序集执行某些操作。SQL Server 2005 使用 CAS 帮助保证托管代码的安全,并避免操作系统或数据库服务器受到威胁。
CLR 集成的优点
Transact-SQL 专门为数据库中的直接数据访问和操作而设计。尽管 Transact-SQL 在数据访问和管理方面领先,但是它没有提供编程构造来使数据操作和计算更加容易。例如,Transact-SQL 不支持数组、集合、for-each 循环、位转移或类。尽管在 Transact-SQL 中可以模拟其中某些构造,但是托管代码对这些构造提供集成支持。根据方案的不同,这些功能可以为使用托管代码实现某些数据库功能提供令人心动的理由。
Microsoft Visual Basic .NET 和 Microsoft Visual C# 提供面向对象的功能,例如封装、继承和多态性。现在,相关代码可以很容易在类和命名空间中进行组织。在使用大量服务器代码时,这样可以更容易地组织和维护您的代码。
对于计算和复杂的执行逻辑,托管代码比 Transact-SQL 更适合,它全面支持许多复杂的任务,包括字符串处理和正则表达式。通过 .NET Framework 库中提供的功能,可以访问数千个预生成的类和例程。可以很容易从任何存储过程、触发器或用户定义函数进行访问。基类库 (BCL) 包括的类提供用于字符串操作、高级数学运算、文件访问、加密等的功能。
注意
尽管其中许多类可以从 SQL Server 的 CLR 代码中使用,但是不适合服务器端使用的类(例如窗口类)将无法使用。
托管代码的一个优点是类型安全性,即确保代码只通过正确定义并且权限许可的方式访问类型。在执行托管代码之前,CLR 将验证代码是否安全。例如,通过检查代码来确保不读取以前未曾写入的内存。CLR 还可以帮助确保代码不操作非托管内存。
选择 Transact-SQL 和托管代码
在编写存储过程、触发器和用户定义函数时,必须做的一个决定是使用传统的 Transact-SQL 还是使用 Visual Basic .NET 或 Visual C# 等 .NET Framework 语言。对于几乎或根本不需要过程逻辑的数据访问,请使用 Transact-SQL。对于具有复杂逻辑的 CPU 密集型函数和过程,或要使用 .NET Framework 的 BCL 时,请使用托管代码。
选择在服务器中执行和在客户端中执行
决定使用 Transact-SQL 还是托管代码的另一个因素是您希望代码驻留的位置,驻留在服务器计算机上还是客户端计算机上。Transact-SQL 和托管代码均可以在服务器上运行。这样使代码和数据距离很近,可以利用服务器的处理能力。另一方面,您可能希望避免将处理器密集型任务放在数据库服务器上。现在,大多数客户端计算机非常强大,您可能希望将尽可能多的代码放在客户端上,以利用客户端的处理能力。托管代码可以在客户端计算机上运行,而 Transact-SQL 不能。
选择扩展存储过程和托管代码
生成的扩展存储过程可以执行 Transact-SQL 存储过程无法执行的功能。但是,扩展存储过程会影响 SQL Server 进程的完整性,而通过类型安全性验证的托管代码不会。另外,内存管理、线程和构造的调度以及同步服务在 CLR 的托管代码与 SQL Server 之间更深入地集成。通过 CLR 集成,可以通过比扩展存储过程更加安全、可伸缩性更强的方式来编写所需的存储过程,以执行 Transact-SQL 中无法执行的任务。