如何在 SQL Server 语言扩展中调用 .NET 运行时

适用于: SQL Server 2019 (15.x) 及更高版本

SQL Server 语言扩展功能使用 sp_execute_external_script 系统存储过程作为接口来调用 .NET 运行时。

本操作说明文章介绍了在 SQL Server 上执行的 C# 代码的实现详细信息。

放置 C# 类的位置

可以通过使用外部库 DDL 将已编译的 .NET 库 (DLL) 和其他依赖项上传到数据库中来调用 SQL Server 中的 C# 代码。 有关详细信息,请参阅从 C# 项目创建 .NET DLL

基本原则

下面是在 SQL Server 上执行 C# 时的一些基本原则。

  • 编译的自定义 .NET 类必须存在于 DLL 文件中。

  • 所调用的 C# 方法必须在存储过程上的 script 参数中提供。

  • 如果类属于某个包,则必须提供 packageName

  • params 用于将参数传递到 C# 类。 不支持调用需要参数的方法。 因此,形参是将实参值传递到方法的唯一方式。

注意

此说明重述了 SQL Server 2019 (15.x) 及更高版本中特定于 C# 的受支持和不受支持的操作。 在存储过程中,支持输入参数,而不支持输出参数。

调用 C# 代码

sp_execute_external_script 系统存储过程是用于调用 .NET 运行时的接口。 以下示例显示了使用 .NET 扩展的 sp_execute_external_script 以及用于指定路径、脚本和自定义代码的参数。

注意

无需定义要调用的方法。 默认情况下,会调用名为 Execute 的方法。 这意味着需要遵循 SQL Server 用于 C# 的 Microsoft 扩展性 SDK,并在 C# 类中实现 Execute 方法。

DECLARE @param1 INT;

SET @param1 = 3;

EXEC sp_execute_external_script
    @language = N'dotnet',
    @script = N'<PackageName>.<ClassName>',
    @input_data_1 = N'<Input Query>',
    @param1 = @param1;

使用外部库

在 SQL Server 2019 (15.x) 及更高版本中,可以在 Windows 使用适用于 C# 语言的外部库。 可以使用 CREATE EXTERNAL LIBRARY DDL 将类编译到 DLL 文件中,并将 DLL 和其他依赖项上传到数据库中。

如何使用外部库上传 DLL 文件的示例:

CREATE EXTERNAL LIBRARY [dotnetlibrary]
FROM (CONTENT = '<local path to .dll file>')
WITH (LANGUAGE = 'dotnet');
GO

创建外部库时,SQL Server 将自动具有对 C# 类的访问权限,并且无需将任何特殊访问权限设置为路径。

以下代码是从上传为外部库的包 Execute 调用类 MyClass 中的 MyPackage 方法的示例:

EXEC sp_execute_external_script
    @language = N'dotnet',
    @script = N'MyPackage.MyClass',
    @input_data_1 = N'SELECT * FROM MYTABLE'
WITH RESULT SETS((column1 INT));

有关详细信息,请参阅 CREATE EXTERNAL LIBRARY