• SQL Server 报错:com.microsoft.sqlserver.jdbc.SQLServerException: The "variant" data type is not supported.


    查询 SQL SERVER 中某张表结构,sql 语句如下:

    SELECT
    	tb.name AS tableName,
    	col.name AS columnName,
    	col.max_length AS length,
    	col.is_nullable AS isNullable,
    	t.name AS type,
    	(
    	SELECT
    		TOP 1 ind.is_primary_key
    	FROM
    		sys.index_columns ic
    		LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id AND ic.index_id= ind.index_id AND ind.name LIKE 'PK_%'
    	WHERE
    		ic.object_id = tb.object_id AND ic.column_id= col.column_id
    	) AS isPrimaryKey,
    	com.value AS comment
    FROM
    	sys.TABLES tb
    	INNER JOIN sys.columns col ON col.object_id = tb.object_id
    	LEFT JOIN sys.types t ON t.user_type_id = col.user_type_id
    	LEFT JOIN sys.extended_properties com ON com.major_id = col.object_id
    	AND com.minor_id = col.column_id
    WHERE
    	tb.name = '表名'
    

    该 sql 可以正常执行,但是当把 sql 放到 jdbcTemplate 中执行时报一下错误:

    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The "variant" data type is not supported.
    

    原因是 sql 语句 select 后面有 sql_variant 类型的属性,在 JDBC 中不支持它。使用 sp_columns 命令最终查出 sys.extended_properties 表的 value 属性的 TYPE_NAMEsql_variant 类型的,sql 如下:

    sp_columns extended_properties
    

    解决方法是使用 CONVERT 函数将该属性转成 varchar 类型。

    CONVERT 函数的用法参考:SQL Server 中 CONVERT() 函数的使用

    修改后的 sql 语句为:

    SELECT
    	tb.name AS tableName,
    	col.name AS columnName,
    	col.max_length AS length,
    	col.is_nullable AS isNullable,
    	t.name AS type,
    	(
    	SELECT
    		TOP 1 ind.is_primary_key
    	FROM
    		sys.index_columns ic
    		LEFT JOIN sys.indexes ind ON ic.object_id = ind.object_id AND ic.index_id= ind.index_id AND ind.name LIKE 'PK_%'
    	WHERE
    		ic.object_id = tb.object_id AND ic.column_id= col.column_id
    	) AS isPrimaryKey,
    	CONVERT(varchar(200), com.value) AS comment
    FROM
    	sys.TABLES tb
    	INNER JOIN sys.columns col ON col.object_id = tb.object_id
    	LEFT JOIN sys.types t ON t.user_type_id = col.user_type_id
    	LEFT JOIN sys.extended_properties com ON com.major_id = col.object_id
    	AND com.minor_id = col.column_id
    WHERE
    	tb.name = '表名'
    

    参考:

    com.microsoft.sqlserver.jdbc.SQLServerException: The "variant" data type is not supported.

  • 相关阅读:
    python 时间差计算
    NET Framework 4.5新特性 (一) 数据库的连接加密保护。
    某表含有N个字段超精简模糊查询方法
    清空javascript数组数据
    IIS无法连接LocalDb,怎么办?
    jquery 模糊查询对象属性
    解释杨中科随机数为什么会骗人?
    前端Js传递数组至服务器端
    javascript获取客户端默认打印机
    水晶报表注意的问题
  • 原文地址:https://www.cnblogs.com/wu726/p/9359732.html
Copyright © 2020-2023  润新知