适用于:
SQL Server 2019 (15.x) 及更高版本
SQL Server 语言扩展
功能使用
sp_execute_external_script
系统存储过程作为接口来调用 Java 运行时。
本操作说明文章介绍了在 SQL Server 上执行的 Java 类和方法的实现详细信息。
放置 Java 类的位置
可以采用两种方法在 SQL Server 中调用 Java 类:
将
.class
或
.jar
文件放置在
Java classpath
中。
使用
外部库
DDL 将已编译的类上传到
.jar
文件中,并且将其他依赖项上传到数据库中。
通常建议使用
.jar
文件而不是单独的
.class
文件。 这在 Java 中是常见的做法,这将使整体体验更加轻松。 另请参阅
从类文件创建 Java .jar 文件
。
使用 Classpath
下面是在 SQL Server 上执行 Java 时的一些基本原则。
已编译的自定义 Java 类必须存在于 Java classpath 中的
.class
文件或
.jar
文件中。
CLASSPATH 参数
提供已编译的 Java 文件的路径。
所调用的 Java 方法必须在存储过程上的
script
参数中提供。
如果类属于某个包,则必须提供
packageName
。
params
用于将参数传递到 Java 类。 不支持调用需要参数的方法。 因此,形参是将实参值传递到方法的唯一方式。
此说明重述了 SQL Server 2019 (15.x) 及更高版本中特定于 Java 的受支持和不受支持的操作。 在存储过程中,支持输入参数,而不支持输出参数。
调用 Java 类
sp_execute_external_script
系统存储过程是用于调用 Java 运行时的接口。 以下示例显示了使用 Java 扩展的
sp_execute_external_script
以及用于指定路径、脚本和自定义代码的参数。
无需定义要调用的方法。 默认情况下,会调用名为
execute
的方法。 这意味着需要遵循
SQL Server 用于 Java 的 Microsoft 扩展性 SDK
,并在 Java 类中实现 execute 方法。
DECLARE @param1 INT
SET @param1 = 3
EXEC sp_execute_external_script @language = N'Java',
@script = N'<packageName>.<ClassName>',
@input_data_1 = N'<Input Query>',
@param1 = @param1;
设置 CLASSPATH
在编译一个或多个 Java 类或在 Java .jar 中创建 classpath 文件后,有两个选项可用于向 SQL Server Java 扩展提供路径:
使用外部库
最简单的选项是通过创建外部库并将此库指向 jar 来使 SQL Server 自动找到你的类。 使用 Java 的外部库
注册系统环境变量
你可以创建系统环境变量,并提供指向包含这些类的 .jar 文件的路径。 创建名为 CLASSPATH 的系统环境变量。
使用外部库
在 SQL Server 2019 (15.x) 及更高版本中,可以在 Windows 和 Linux 上使用适用于 Java 语言的外部库。 可以使用 CREATE EXTERNAL LIBRARY DDL 将类编译到 .jar 文件中,并将 .jar 文件和其他依赖项上传到数据库中。
如何使用外部库上传 .jar 文件的示例:
CREATE EXTERNAL LIBRARY myJar
FROM (CONTENT = '<local path to .jar file>')
WITH (LANGUAGE = 'Java');
创建外部库时,SQL Server 将自动具有对 Java 类的访问权限,并且无需将任何特殊访问权限设置为 classpath。
以下代码是从上传为外部库的包调用类中的方法的示例:
EXEC sp_execute_external_script
@language = N'Java',
@script = N'MyPackage.MyCLass',
@input_data_1 = N'SELECT * FROM MYTABLE'
WITH RESULT SETS((column1 INT));
有关详细信息,请参阅 CREATE EXTERNAL LIBRARY。
到 SQL Server 的环回连接
使用环回连接通过 JDBC 连接回 SQL Server,以从 sp_execute_external_script 执行的 Java 中读取或写入数据。 当无法使用 sp_execute_external_script 的 InputDataSet 和 OutputDataSet 参数时,可以使用此功能。
若要在 Windows 中建立环回连接,请使用以下示例:
jdbc:sqlserver://localhost:1433;databaseName=Adventureworks;integratedSecurity=true;
若要在 Linux 中建立环回连接,JDBC 驱动程序需要以下证书中定义的三个连接属性:
Client-Certificate-Authentication
教程:在 Java 中使用正则表达式 (regex) 搜索字符串