0

在我们的应用程序中,用户可以输入 SQL 代码来从 NexusDB 数据库中检索数据。我们希望在不实际执行查询的情况下确定此类查询结果的元数据。我们使用元数据来确定字段的数量和每个结果字段的数据类型。

[补充] 我们将此功能用作用户定义的转换过程的一部分。实际的转换稍后在类似批处理的过程中完成,但我们需要事先元数据,因此用户可以在转换中指定其他字段特征或修改,如应用插件、创建父子关系等。 [/addition ]

到现在为止,我们基本上是通过添加WHERE FALSE到 SQL 查询或将所有已经存在WHERE的语句替换为WHERE FALSE AND. 但当然,我们必须解析整个 SQL 以确定要调整的正确 where 子句的确切位置,同时考虑注释、嵌套的 SELECTS、JOIN 和其他子句。这种方式变得相当复杂:-(

另一个缺点是,大多数时候查询的执行仍然需要很长时间,即使我们事先知道结果集是空的。

我们想知道是否有另一种方法可以实现这一目标。

即 TQuery 对象必须有自己的解析器,将 SQL 语句拆分为不同的子句。如果我们可以在执行之前更改 where 子句,我们就不必自己进行解析。但是我们有点急于深入 TQuery 对象的内部,只是为了发现没有办法以我们想要的方式使用它。

有人对此有任何建议吗?

4

3 回答 3

3

您已经做的一个变体是将原始 SQL 语句放在嵌套选择中,而不是修改 where 子句。如果select * from MyTable是您的复杂查询,您可以像这样嵌入它以获得任何结果。

select *
from
(
  select *
  from MyTable
) as xx
where 0=1

我只在 SQL Server 中测试过这个,而不是在 NexusDB 中

于 2011-03-14T10:55:04.453 回答
1

深入研究客户端 TnxQuery 组件无济于事。它只是一个语句和游标句柄的包装器。在客户端检索您所追求的元数据的唯一方法是从光标句柄。只有在执行查询时才会生成游标句柄。

目前,在执行查询时最小化正在执行的工作的唯一方法是您已经在做的事情。

如果您在我们的问题跟踪器(http://www.nexusdb.com/mantis/view_all_bug_page.php)中提出功能请求,我们可以研究指定一些标志来告诉引擎“从不处理任何数据”的可能性,而无需搞乱查询本身。

于 2011-03-14T11:43:07.853 回答
0

You can also try to link a TClientDataset with a TDatasetProvider to the original TQuery (Or any TDataset descendant). Then set the PacketRecords property of the TClientDataset to 0, and open it. It will retrieve the fields in the TClientDataSet, without any data.

于 2011-03-14T16:36:32.107 回答