Groovy JDBC 应用程序中的 SQL 列名?

Posted

技术标签:

【中文标题】Groovy JDBC 应用程序中的 SQL 列名?【英文标题】:SQL column names in Groovy JDBC app? 【发布时间】: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 的命令行查询工具也是如此。显示“未标记”的列名对我来说似乎很弱。 【参考方案1】:

您可以在带有参数(模式、objName)的可编程对象中放入以下查询,以列出表或视图的列。

--get the columns of a table
select c.name
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name = 'Person' and t.schema_id = schema_id('Person');

--get the columns of a view
select c.name
from sys.columns c
inner join sys.views t on c.object_id = t.object_id
where t.name = 'vEmployee' and t.schema_id = schema_id('dbo');

【讨论】:

不,问题是我们需要执行任意查询并获取列名——我们无法控制查询。如果可以,我们只需执行“xxxxx AS Name”(这会在 getColumnName 中返回“Name”)。【参考方案2】:

在您目前的查询中,您的第二列没有名称。你需要给它一个别名,如下所示:

select name, type_name(user_type_id) AS whatever, max_length from sys.parameters where object_id = object_id('some procedure name')

然后您的第二列的名称将显示为whatever

【讨论】:

以上是关于Groovy JDBC 应用程序中的 SQL 列名?的主要内容,如果未能解决你的问题,请参考以下文章

在 JDBC 中获取列名

如何在 groovy sql 中设置连接超时?

Groovy 中的 sql.rows() 运行缓慢

如何打印加入 JDBC 的 3 个表中的列名? [复制]

Informix JDBC PySpark 将列名中的结果作为列值读取

Groovy语言之SpringBoot整合JDBC案例