首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JDBC 查詢 sys.extended_properties [value] 欄位報 variant 不支援:CAST 轉換解決

     編輯:程式設計綜合問答

錯誤訊息

com.microsoft.sqlserver.jdbc.SQLServerException: 不支援 "variant" 資料類型。

原因

sys.extended_properties.value 為 SQL Server sql_variant 型別,JDBC 驅動程式 (特別是舊版) 無法直接映射至 Java 型別,導致 ResultSet.getObject() 拋出異常。

解決方案:SQL 層面 CAST 為確定型別

SELECT TOP 100 CAST([value] AS NVARCHAR(MAX)) AS [value]
FROM sys.extended_properties
  • NVARCHAR(MAX) 可容納任意長度 Unicode 字串,相容所有 sql_variant 子型別 (數字、日期、字串、二進位...) 的文字表示。
  • 若確定資料為數字/日期,可分別 CAST(... AS INT)、CAST(... AS DATETIME) 等,取得對應 Java 型別 (Integer, Timestamp)。

Java 端程式碼

String sql = "SELECT TOP 100 CAST([value] AS NVARCHAR(MAX)) AS val FROM sys.extended_properties";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {

    while (rs.next()) {
        String val = rs.getString("val"); // 安全取得字串
        System.out.println(val);
    }
}

驅動程式版本建議

使用 **Microsoft JDBC Driver 10.2+** (或最新 12.x),對 sql_variant 支援度大幅提升,但**仍建議在 SQL 端明確 CAST**,避免跨版本相容性問題。

擴充:取得屬性名稱與值

SELECT 
    obj.name AS object_name,
    ep.name AS property_name,
    CAST(ep.value AS NVARCHAR(MAX)) AS property_value
FROM sys.extended_properties ep
JOIN sys.objects obj ON ep.major_id = obj.object_id
WHERE ep.class = 1; -- 1 = OBJECT_OR_COLUMN
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved