バージョン6.3.0以降、JDBCドライバーはsql_variantデータ型をサポートしています。 sql_variant は、テーブル値パラメーターや BulkCopy などの機能を使用する場合にもサポートされていますが、これにはいくつかの制限があります。 すべてのデータ型を sql_variant データ型に格納することはできません。 sl_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 を使用して、sql_variant に格納されている
datetime/smalldatetime/date値をテーブルに入力する場合、ResultSet でgetDateTime()/getSmallDateTime()/getDate()を呼び出すと動作せず、次の例外がスローされます。Java.lang.String cannot be cast to java.sql.Timestamp回避策: 代わりに
getString()またはgetObject()を使用します。TVP を使用してテーブルにデータを入力し、sql_variant で null 値を送信することはサポートされていません。 これを実行しようとすると、例外が発生します。
Inserting null value with column type sql_variant in TVP is not supported.