【发布时间】:2016-08-25 14:30:36
【问题描述】:
我们在 Groovy 程序中使用 JDBC 访问 SQL Server 数据库。
我们执行查询并尝试使用如下代码确定输出的列名:
result = sql.rows(query)
{
meta ->
colNames = (1..meta.columnCount).collect
{ meta.getColumnName(it) }
colTypes = (1..meta.columnCount).collect
{ meta.getColumnTypeName(it) }
colNull = (1..meta.columnCount).collect
{ meta.isNullable(it) }
colAuto = (1..meta.columnCount).collect
{ meta.isAutoIncrement(it) }
}
问题是,对于某些查询,getColumnName() 函数返回空值。例如,像这样的查询:select name, type_name(user_type_id), max_length from sys.parameters where object_id = object_id('some procedure name') 总是为第二列返回 null。
我们检查了“getColumnLabel()”,它似乎给了我们与“getColumnName()”相同的值。
没有制定我们自己的方案,当 getColumnName() 返回 null 时,是否有推荐的方法来生成列名?
这是 Ubuntu 15.04、Java 1.8.0_45、Groovy 1.8.6、SQLJDBC42 和 SQL Server 2014。
【问题讨论】:
-
sys.parameters 是对象参数的动态视图。例如存储过程的参数。您要生成哪些列名?一张桌子?
-
这只是一个例子。问题是在这种情况下的“type_name(user_type_id)”......它返回null(任何表上任何类似计算的列也是如此)
-
type_name() 在错误或调用者无权查看对象时返回 NULL。看看这个。另见此参考msdn.microsoft.com/en-us/library/ms189750.aspx
-
您的查询中没有列名(或标签):添加一个
AS子句或使用它并改用索引。 -
@Mark Rotteveel:是的,你是对的,这个查询中没有特定的标签——这就是我们试图解决的问题(用户生成查询——我们无法控制它们,但想要正确标记输出)。其他数据库上的相同查询返回“type_name(user_type_id)”作为 getColumnLabel() 的标签,当我们运行相同查询时,Microsoft 的命令行查询工具也是如此。显示“未标记”的列名对我来说似乎很弱。
标签: sql-server jdbc groovy