Использование данных типа sql_variant
Начиная с версии 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.
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по