.NET framework SQL 服务器支持哪个版本?

Which version of .NET framework SQL Server supports?

我想为 SQL 服务器创建 SQL 基于 CLR 的存储过程。如您所知,我可以针对多个版本的 .NET 框架构建一个 dll。我找不到描述哪个版本的 SQL 服务器支持哪个版本的 .NET 框架的参考。谁能帮我指明正确的方向?

明确地说,一个 CLR 版本通常有多个版本的 .NET Framework 与之配合使用。但是,单一版本的 .NET Framework 仅适用于一个特定版本的 CLR。例如,CLR 2.0 版适用于 .NET Framework 2.0、3.0 和 3.5 版,而 CLR 4.0 版适用于 .NET Framework 的所有 4.x 版本(即 4.0、4.5[.x]、4.6 [.x]、4.7[.x] 等)。要查看 CLR 版本与框架版本关系的图表,请参阅 .NET Framework Versions and Dependencies.

的 MSDN 页面

关于SQLCLR代码,SQLServer只支持单一版本的CLR,具体版本取决于SQLServer的版本。 SQL Server 2005、2008 和 2008 R2 仅适用于 CLR 版本 2。由于 CLR 版本 2 仅适用于 .NET Framework 版本 2.0、3.0 和 3.5,这意味着 SQL Server 2005、2008和 2008 R2 仅适用于 .NET Framework 版本 2.0、3.0 和 3.5。

当然,SQL Server 2005 的 CLR 集成功能(它的初始版本)是围绕 .NET Framework 2.0 版构建的(因为那是当时可用的版本),所以有一些.NET Framework 版本 3.0 和 3.5 中较新的库在 SQL Server 2005 中不工作而无需手动导入它们(即 System.CoreSystem.Xml.Linq)。同样,SQL Server 2012、2014、2016、2017 和 2019 静态链接到 CLR 版本 4,后者与 .NET Framework 版本 4.0、4.5[.x]、4.6[.x] 一起使用,和 4.7[.x].

如果更容易理解,上面提到的信息,以图表形式是:

SQL Server version      |   CLR version   |   .NET Framework version(s)
------------------------|-----------------|----------------------------
2005                    |   2.0           |   2.0, 3.0 **, and 3.5 **
                        |                 | ** To use any functionality within
                        |                 |    System.Core or System.Xml.Linq
                        |                 |    libraries, they must be imported
                        |                 |    manually as UNSAFE.
------------------------|-----------------|----------------------------
2008 and 2008 R2        |   2.0           |   2.0, 3.0, and 3.5
------------------------|-----------------|----------------------------
2012, 2014, 2016, 2017, |   4.0           |   4.0+
and 2019, (and should   |                 |
also be Azure SQL DB    |                 |
Managed Instance)       |                 |
------------------------|-----------------|----------------------------

关于从 System.Environment.Version(.NET 代码)和 SELECT [value] FROM sys.dm_clr_properties WHERE [name] = N'version'; 返回的信息,他们报告的是 CLR 版本,不是 .NET Framework 版本。因此,请注意不要将报告 2.0 或 4.0 的这两个东西混淆,这意味着您只能使用 Framework 版本 2.0 或 4.0。

幸运的是,由于向后兼容,针对 CLR 2 框架版本(2.0、3.0 和 3.5)编译的代码将 运行 无需在 SQL Server 2012 和更新版本中重新编译,即使它们使用的是 CLR 版本 4。

因此,使用目标框架版本 2.0 通常不会出错,但您肯定可以使用 2.0 之后的框架版本。

要更深入地了解开发 SQLCLR 代码,请查看我写的以下文章(以及整个系列):

Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)

有关使用 SQLCLR 的更多信息,请访问:SQLCLR Info