Использование данных типа sql_variant

Скачать драйвер JDBC

Начиная с версии 6.3.0, драйвер JDBC поддерживает тип данных sql_variant. Sql_variant также поддерживается при использовании таких функций, как возвращающие табличные значения параметры и BulkCopy с некоторыми ограничениями. В типе данных sql_variant можно хранить не все типы данных. Список поддерживаемых типов данных с sql_variant см. в статье о sql_variant (Transact-SQL).

Заполнение и получение таблицы

Предположим, что у одного столбца есть таблица со столбцом sql_variant:

CREATE TABLE sampleTable (col1 sql_variant)

Пример скрипта для вставки значений с помощью оператора:

try (Statement stmt = connection.createStatement()){
    stmt.execute("insert into sampleTable values (1)");
}

Вставка значения с помощью подготовленного оператора:

try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
    preparedStatement.setObject(1, 1);
    preparedStatement.execute();
}

Если известен базовый тип передаваемых данных, можно использовать соответствующий метод задания. Например, при вставке значения с целым числом можно использовать preparedStatement.setInt().

try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
    preparedStatement.setInt (1, 1);
    preparedStatement.execute();
}

Для чтения значений из таблицы можно использовать соответствующие методы получения. Например, если поступающие от сервера значения известны, можно использовать метод getInt() или getString():

try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
    resultSet.next();
    resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}

Использование хранимых процедур с sql_variant

При наличии хранимой процедуры, например:

String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";

Выходные параметры должны быть зарегистрированы:

try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
    callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
    callableStatement.execute();
}

Ограничения sql_variant

  • При использовании TVP для заполнения таблицы datetime/smalldatetime/date значения, хранящегося в sql_variant, вызов getDateTime()/getSmallDateTime()/getDate() в ResultSet не будет работать и вызовет следующее исключение:

    Java.lang.String cannot be cast to java.sql.Timestamp

    Обходное решение: вместо этого используйте getString() или getObject().

  • Использование TVP для заполнения таблицы и отправка нулевого значения в sql_variant не поддерживается. В противном случае вызывается исключение:

    Inserting null value with column type sql_variant in TVP is not supported.

См. также раздел

Основные сведения о типах данных JDBC Driver