公共语言运行时(CLR)是Microsoft .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境。 在 CLR 中运行的代码称为托管代码。 CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译、分配和管理内存、强制类型安全、异常处理、线程管理和安全性。 有关详细信息,请参阅 .NET Framework SDK。
使用托管在 MICROSOFT SQL Server(称为 CLR 集成)中的 CLR,可以在托管代码中创作存储过程、触发器、用户定义的函数、用户定义的类型和用户定义的聚合。 由于托管代码在执行之前编译为本机代码,因此在某些情况下可以实现显著的性能提升。
托管代码使用代码访问安全性(CAS)来防止程序集执行某些作。 SQL Server 使用 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 代码,但不适合服务器端使用(例如窗口化类)的类不可用。 有关详细信息,请参阅 支持的 .NET Framework 库。
托管代码的一个好处是类型安全,即确保代码仅以明确定义和许可的方式访问类型。 在执行托管代码之前,CLR 将验证该代码是否安全。 例如,检查代码以确保没有读取以前未写入的内存。 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 中无法执行的任务所需的存储过程。 有关 CLR 集成和扩展存储过程的详细信息,请参阅 CLR 集成的性能。