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 列名?的主要内容,如果未能解决你的问题,请参考以下文章