如何使用JDBC将表值参数(类似数组的参数)传递给Microsoft SQL Server 2008 R2中的存储过程?

时间:2011-09-21 15:26:13

标签: sql-server sql-server-2008 stored-procedures jdbc jtds

如何使用Microsoft SQL Server 2008 R2 JDBC驱动程序将表值参数(类似数组的参数)传递给Microsoft SQL Server 2008 R2中的存储过程? 是否有可能使用jTDS?

3 个答案:

答案 0 :(得分:2)

当前(3.0)Microsoft驱动程序不支持传递TVP。

有一次,微软正在为TVP和Bulk Copy征求选票:

http://blogs.msdn.com/b/jdbcteam/archive/2011/09/22/tvp-or-bulk-copy.aspx

TVP获得了更多选票,但仍有待观察实际完成的工作。版本4.0的最新CTP似乎没有TVP支持。

答案 1 :(得分:1)

虽然这个问题是关于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

答案 2 :(得分:0)

我自己解决了这个问题。我创建了CLR .Net Stored Proc并接受了BLOB参数。这个BLOB只是序列化INT的列表。可以使用T-SQL或.Net CLR SP对其进行反序列化。 .Net CLR SP具有更好的性能,这对我的项目非常重要。