使用 Sql_variant 資料類型

下載 JDBC 驅動程式

從 6.3.0 版本開始,JDBC 驅動程式支援 sql_variant 資料型態。 使用資料表值參數和 BulkCopy 等功能時,也支援 Sql_variant,但有一些限制。 並非所有資料類型都可以儲存在 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();
}

如果要傳遞之資料的底層類型為已知,便可以使用相對應 setter。 例如,可以在插入整數值時使用 preparedStatement.setInt()。

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

若要從資料表讀取值,可以使用相對應的 getter。 例如,如果來自伺服器的值為已知,便可以使用 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.