Как передать таблично-значимые параметры (массив-подобный параметр) хранимой процедуре в Microsoft SQL Server 2008 R2 с использованием JDBC?
Как передать таблично-значимые параметры (как в массиве) в хранимую процедуру в Microsoft SQL Server 2008 R2 с помощью драйвера JDBC Microsoft SQL Server 2008 R2? Возможно ли это с помощью jTDS?
3 ответа
Текущий (3.0) драйвер Microsoft не поддерживает передачу TVP.
В какой-то момент Microsoft собирала голоса для TVP против Bulk Copy:
http://blogs.msdn.com/b/jdbcteam/archive/2011/09/22/tvp-or-bulk-copy.aspx
TVP получил больше голосов, но еще неизвестно, что на самом деле было сделано. Последняя версия CTP для версии 4.0, по-видимому, не поддерживает TVP.
Хотя этот вопрос касался 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()) {
...
}
}
Я решил эту проблему самостоятельно. Я создал CLR .Net Stored Proc с принимает параметр BLOB. Этот BLOB - просто список сериализованных INT. Его можно десериализовать, используя T-SQL или.Net CLR SP. .Net CLR SP имеет лучшую производительность, что было действительно важно для моего проекта.