Как передать таблично-значимые параметры (массив-подобный параметр) хранимой процедуре в 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 имеет лучшую производительность, что было действительно важно для моего проекта.

Другие вопросы по тегам