【发布时间】:2022-01-23 23:37:07
【问题描述】:
谁能提供一些关于如何将表值参数 (TVP) 与 SQL Server JDBC 一起使用的指导?我正在使用微软提供的 6.0 版本的 SQL Server 驱动程序,我查看了official documentation 以及更有用的示例
How to pass Table-Valued parameters from java to sql server stored procedure?
这两个示例都显示了从Connection.prepareStatement 调用中获取SQLServerPreparedStatement 转换对象以调用setStructured 方法。这不会阻止标准连接池(例如 DBCP2)的使用吗?
我注意到另一个 Stack Overflow 评论中的一条评论说可以改用 stmt.setObject 方法:
作为转换 PreparedStatement 的替代方法,您可以将 SQLServerDataTable 实例传递给 PreparedStatement.setObject(int,Object) 方法。这适用于在 dbo 模式中定义的 TVP 类型。 – allenru 7 月 15 日 19:18
虽然我在尝试这个时遇到了错误,并且类型 is 在 dbo 架构中......
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The Table-Valued Parameter must have a valid type name.
这是我的代码:
// JAVA
private static void tableParameters(DataSource ds) throws SQLException {
final String sql = "EXEC dbo.GetAccountsFromTable @accountIds=?";
final List<Integer> accountIds = generateIntegers(50, 1_000_000);
try (Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql))
{
SQLServerDataTable accounts = new SQLServerDataTable();
accounts.addColumnMetadata("item", java.sql.Types.INTEGER);
for (Integer aid : accountIds)
accounts.addRow(aid.toString());
stmt.setObject(1, accounts);
try (ResultSet rs = stmt.executeQuery())
{
while (rs.next()) {
System.out.println(rs.getInt(1));
}
}
}
}
-- TSQL
create type dbo.IntegerTable AS TABLE (item INT);
CREATE PROCEDURE dbo.GetAccountsFromTable(@accountIds dbo.IntegerTable READONLY)
AS
BEGIN
IF OBJECT_ID('tempdb..#AccountIds') IS NOT NULL
DROP TABLE #AccountIds
CREATE TABLE #AccountIds (id INTEGER)
INSERT INTO #AccountIds
SELECT * FROM @accountIds
SELECT * FROM #AccountIds
END
感谢任何帮助或指导。谢谢!
【问题讨论】:
标签: java sql-server jdbc table-valued-parameters