数据库为sqlserver, driver是jtds。
需要判断某个字段是否在某个表中存在,一般做法:
1. 查询出0条或多条记录,即一个ResultSet。如,ResultSet rs。
2. 即可以获取到MetaData对象: ResultSetMetaData metaData = rs.getMetaData();
3. ResultSetMetaData对象里包含所有字段信息,逐个判断就可以了。
例:http://msdn.microsoft.com/en-us/library/ms378557.aspx
关键在于:
使用的SQL语句, SELECT TOP 10 * FROM Person.Contact,查出了10条记录。如果只是需要获取MetaData,获取出记录就是多余的。
把SQL改成: SELECT * FROM Person.Contact where 1=2。这个语句没有查出任何记录,只获取MetaData。
这样看上去似乎完美了。
但是 SELECT * FROM Person.Contact where 1=2 运行效率在这个表有大量记录的时候是不高的,因为进行了全表扫描。
以下是SQL Manager 2011 for SQL Server的分析结果:
由此可见,如果这个表的记录数量级很大的话,执行这条语句的成本是不低的。
可选方案:
1. 避免使用 where 1=2 这样的条件。同事说,现在资深的DBA对这样的语句极为反感,估计是高成本和看不出用意有关。
2. 尽量使用有索引的字段。比如可以利用ID一般不会小于0这个特性,where id < 0 来过虑掉所有记录。不过这要根据不同的表结构来写SQL语句。
3. 我现在碰到的表没有主键,没有索引。。只有使用where 1=2 这个条件。
在网上搜了一把,也还没有搜到其他高效的方法。
2012-05-23 ,现在找到了新的方法,用DatabaseMetaData: