com.microsoft.sqlserver.jdbc.SQLServerException: 不支援 "variant" 資料類型。
sys.extended_properties.value 為 SQL Server sql_variant 型別,JDBC 驅動程式 (特別是舊版) 無法直接映射至 Java 型別,導致 ResultSet.getObject() 拋出異常。
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)。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