3

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

4

3 回答 3

2

当前 (3.0) Microsoft 驱动程序不支持通过 TVP。

在某一时刻,微软正在为 TVP 与 Bulk Copy 进行投票:

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

TVP 获得了更多的选票,但实际完成了什么还有待观察。最新的 CTP 4.0 版似乎不支持 TVP。

于 2011-11-30T23:30:42.927 回答
1

虽然这个问题是关于 SQL Server 2008 的,虽然当时确实不可能传递表值参数,但现在可以了。这在JDBC 驱动程序手册中进行了记录。例如,可以这样做:

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()) {
        ...
    }
}

我最近也在这里写过关于这个的博客

于 2017-10-30T12:31:49.387 回答
0

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

于 2012-01-13T22:44:46.323 回答