SQLServer - 确定列是几何还是地理

时间:2014-12-04 15:11:30

标签: java sql-server jdbc

有没有办法确定Microsoft SQLServer数据库中的列是“几何”还是“地理”?

理想情况下,我想使用Java / JDBC以编程方式执行此操作。我已经尝试过使用java.sql.ResultSetMetaData,但我得到了一个不连贯的响应。

String className = rsmd.getColumnClassName(colID));
System.out.println(className);

输出:

"[B"

如果没有办法通过JDBC / ResultSetMetaData实现,是否可以使用SQL查询?

3 个答案:

答案 0 :(得分:2)

不幸的是,无法通过JDBC ResultSetMetaData类获取此信息。至少没有使用Microsoft的最新JDBC驱动程序(sqljdbc_4.0.2206)。

目前获取此信息的唯一方法是通过查询。例如:

String sql = "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_NAME='" + tableName + "' AND COLUMN_NAME='" + columnName + "'";

我通过反编译 SQLServerResultSetMetaData.class 得出了这个结论。 getColumnClassName()方法的来源称之为:

this.rs.getColumn(paramInt).getTypeInfo().getSSType().getJDBCType().className();

此链中的关键方法是getSSType(),它返回SSType。 SSType类包含数据库中的数据类型与JDBC数据类型之间的映射。 “几何”或“地理”没有映射。恕我直言这是一个错误。这是SSType的来源:

package com.microsoft.sqlserver.jdbc;

enum SSType
{
UNKNOWN(SSType.Category.UNKNOWN, "unknown", JDBCType.UNKNOWN), 
TINYINT(SSType.Category.NUMERIC, "tinyint", JDBCType.TINYINT), 
BIT(SSType.Category.NUMERIC, "bit", JDBCType.BIT),
SMALLINT(SSType.Category.NUMERIC, "smallint", JDBCType.SMALLINT),
INTEGER(SSType.Category.NUMERIC, "int", JDBCType.INTEGER), 
BIGINT(SSType.Category.NUMERIC, "bigint", JDBCType.BIGINT), 
FLOAT(SSType.Category.NUMERIC, "float", JDBCType.DOUBLE), 
REAL(SSType.Category.NUMERIC, "real", JDBCType.REAL), 
SMALLDATETIME(SSType.Category.DATETIME, "smalldatetime", JDBCType.TIMESTAMP),
DATETIME(SSType.Category.DATETIME, "datetime", JDBCType.TIMESTAMP), 
DATE(SSType.Category.DATE, "date", JDBCType.DATE), 
TIME(SSType.Category.TIME, "time", JDBCType.TIME), 
DATETIME2(SSType.Category.DATETIME2, "datetime2", JDBCType.TIMESTAMP), 
DATETIMEOFFSET(SSType.Category.DATETIMEOFFSET, "datetimeoffset", JDBCType.DATETIMEOFFSET), 
SMALLMONEY(SSType.Category.NUMERIC, "smallmoney", JDBCType.DECIMAL), 
MONEY(SSType.Category.NUMERIC, "money", JDBCType.DECIMAL), 
CHAR(SSType.Category.CHARACTER, "char", JDBCType.CHAR), 
VARCHAR(SSType.Category.CHARACTER, "varchar", JDBCType.VARCHAR), 
VARCHARMAX(SSType.Category.LONG_CHARACTER, "varchar", JDBCType.LONGVARCHAR), 
TEXT(SSType.Category.LONG_CHARACTER, "text", JDBCType.LONGVARCHAR), 
NCHAR(SSType.Category.NCHARACTER, "nchar", JDBCType.NCHAR), 
NVARCHAR(SSType.Category.NCHARACTER, "nvarchar", JDBCType.NVARCHAR), 
NVARCHARMAX(SSType.Category.LONG_NCHARACTER, "nvarchar", JDBCType.LONGNVARCHAR), 
NTEXT(SSType.Category.LONG_NCHARACTER, "ntext", JDBCType.LONGNVARCHAR), 
BINARY(SSType.Category.BINARY, "binary", JDBCType.BINARY), 
VARBINARY(SSType.Category.BINARY, "varbinary", JDBCType.VARBINARY), 
VARBINARYMAX(SSType.Category.LONG_BINARY, "varbinary", JDBCType.LONGVARBINARY), 
IMAGE(SSType.Category.LONG_BINARY, "image", JDBCType.LONGVARBINARY), 
DECIMAL(SSType.Category.NUMERIC, "decimal", JDBCType.DECIMAL), 
NUMERIC(SSType.Category.NUMERIC, "numeric", JDBCType.NUMERIC), 
GUID(SSType.Category.GUID, "uniqueidentifier", JDBCType.CHAR), 
SQL_VARIANT(SSType.Category.VARIANT, "sql_variant", JDBCType.VARCHAR), 
UDT(SSType.Category.UDT, "udt", JDBCType.VARBINARY), 
XML(SSType.Category.XML, "xml", JDBCType.LONGNVARCHAR), 
TIMESTAMP(SSType.Category.TIMESTAMP, "timestamp", JDBCType.BINARY);

final SSType.Category category;
private final String name;
private final JDBCType jdbcType;

private SSType(SSType.Category paramCategory, String paramString, JDBCType paramJDBCType)
{
this.category = paramCategory;
this.name = paramString;
this.jdbcType = paramJDBCType;
}

public String toString()
{
return this.name;
}

final JDBCType getJDBCType()
{
return this.jdbcType;
}

boolean convertsTo(JDBCType paramJDBCType)
{
return SSType.GetterConversion.converts(this, paramJDBCType);
}
}

答案 1 :(得分:1)

您可以从名为INFORMATION_SCHEMA.COLUMNS的特殊系统表中获取所有列的信息。可以为所需的表(或列)添加where语句。像任何其他表一样可访问。

SELECT TOP 1000 * FROM INFORMATION_SCHEMA.COLUMNS

答案 2 :(得分:0)

看看sys.columns。在system_type_id上​​使用sys.types加入它。