有没有办法确定Microsoft SQLServer数据库中的列是“几何”还是“地理”?
理想情况下,我想使用Java / JDBC以编程方式执行此操作。我已经尝试过使用java.sql.ResultSetMetaData,但我得到了一个不连贯的响应。
String className = rsmd.getColumnClassName(colID));
System.out.println(className);
输出:
"[B"
如果没有办法通过JDBC / ResultSetMetaData实现,是否可以使用SQL查询?
答案 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加入它。