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