如何使用 JDBC 将表值参数(类数组参数)传递给 Microsoft SQL Server 2008 R2 中的存储过程? [复制]
Posted
技术标签:
【中文标题】如何使用 JDBC 将表值参数(类数组参数)传递给 Microsoft SQL Server 2008 R2 中的存储过程? [复制]【英文标题】:How to pass Table-Valued Parameters (Array-like Parameter) to Stored Procedure in Microsoft SQL Server 2008 R2 using JDBC? [duplicate] 【发布时间】:2011-09-21 15:26:13 【问题描述】:如何使用 Microsoft SQL Server 2008 R2 JDBC Driver 将表值参数(类数组参数)传递给 Microsoft SQL Server 2008 R2 中的存储过程? jTDS可以吗?
【问题讨论】:
docs.microsoft.com/en-us/sql/connect/jdbc/… 另见Passing array parameters to a stored procedure 【参考方案1】:当前 (3.0) Microsoft 驱动程序不支持传递 TVP。
在某一时刻,微软正在为 TVP 与批量复制进行投票:
http://blogs.msdn.com/b/jdbcteam/archive/2011/09/22/tvp-or-bulk-copy.aspx
TVP 获得了更多选票,但实际完成了什么还有待观察。最新的 CTP 4.0 版似乎不支持 TVP。
【讨论】:
【参考方案2】:虽然这个问题是关于 SQL Server 2008 的,虽然当时确实不可能传递表值参数,但现在可以了。这在JDBC driver manual 中有记录。例如,可以这样做:
SQLServerDataTable table = new SQLServerDataTable();
table.addColumnMetadata("i" ,java.sql.Types.INTEGER);
table.addRow(1);
table.addRow(2);
table.addRow(3);
table.addRow(4);
try (SQLServerPreparedStatement stmt=
(SQLServerPreparedStatement) connection.prepareStatement(
"SELECT * FROM some_table_valued_function(?)"))
// Magic here:
stmt.setStructured(1, "dbo.numbers", table);
try (ResultSet rs = stmt.executeQuery())
...
I've also recently blogged about this here.
【讨论】:
【参考方案3】:我自己解决了这个问题。我创建了接受 BLOB 参数的 CLR .Net 存储过程。此 BLOB 只是序列化 INT 的列表。可以使用 T-SQL 或 .Net CLR SP 对其进行反序列化。 .Net CLR SP 具有更好的性能,这对我的项目非常重要。
【讨论】:
以上是关于如何使用 JDBC 将表值参数(类数组参数)传递给 Microsoft SQL Server 2008 R2 中的存储过程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章