如何使用 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 中的存储过程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server JDBC 中使用表值参数

将DataTable传递给存储过程中的表值参数不起作用[关闭]

使用 ADO.NET 传递表值参数

将表值参数传递给存储过程

在使用表值参数时如何将多个参数一起传递给存储过程

使用 PetaPoco 将表值参数传递给存储过程