Sql_variant データ型の使用

JDBC ドライバーのダウンロード

バージョン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.