在我们的应用程序中,用户可以输入SQL代码从NexusDB数据库检索数据。我们希望在不实际执行查询的情况下确定此类查询结果的元数据。我们使用元数据来确定字段的数量和每个结果字段的数据类型。
添加我们将此功能用作用户定义的转换过程的一部分。实际的转换是稍后在类似批处理的过程中完成的,但我们需要预先获得元数据,因此用户可以在转换中指定额外的字段特征或修改,如应用插件、创建父子关系等。/addition
到目前为止,我们基本上是通过在SQL查询中添加WHERE FALSE或者用WHERE FALSE AND替换所有已经存在的WHERE语句来做到这一点的。当然,我们必须解析整个SQL以确定要调整的正确where子句的确切位置,并考虑注释、嵌套SELECTS、JOIN和其他子句。这样会变得相当复杂:-(
这样做的另一个缺点是,即使我们事先知道结果集将为空,大多数情况下查询的执行仍然可能需要很长时间。
我们想知道是否有其他方法来实现这一点。
也就是说,TQuery对象必须有自己的解析器,将SQL语句拆分到不同的子句中。如果我们可以在执行前更改where子句,我们就不必自己进行解析了。但是我们有点急于深入研究TQuery对象的内部,只是为了发现没有办法以我们想要的方式使用它。
有人对此有什么建议吗?
发布于 2011-03-14 19:43:08
深入研究客户端TnxQuery组件也无济于事。它只是语句和游标句柄的包装器。在客户端检索元数据的唯一方法是从游标句柄检索。只有在执行查询时才会生成游标句柄。
现在,要最小化执行查询时所执行的工作,唯一的方法就是您已经在做的事情。
如果你在我们的问题跟踪器( http://www.nexusdb.com/mantis/view_all_bug_page.php )中提交了一个功能请求,我们可以研究指定一些标志的可能性,告诉引擎“永远不处理任何数据”,而不需要打乱查询本身。
发布于 2011-03-14 18:55:04
您已经执行的操作的一种变体是将原始SQL语句放入嵌套的select语句中,而不是修改where子句。如果select * from MyTable是您复杂的查询,您可以像这样嵌入它,这样就得不到任何结果。
select *
from
(
select *
from MyTable
) as xx
where 0=1我只在SQL Server中进行了测试,而没有在NexusDB中进行测试
发布于 2011-03-15 00:36:32
您还可以尝试将带有TDatasetProvider的TClientDataset链接到原始TQuery (或任何TDataset子体)。然后将TClientDataset的PacketRecords属性设置为0,并打开它。它将检索TClientDataSet中的字段,但不包含任何数据。
https://stackoverflow.com/questions/5296588
复制相似问题