我正在寻找一个ANSI-SQL方法来执行一个Select查询,而不返回任何记录,但是填充一个TDataSet的Fields结构。
我找到的方法是在任何查询中添加"where 1=0“,例如:
Select Id, name, province
from customers
where 1=0这是一个相当简单的例子,当我必须处理用户输入的查询,然后解析它们,如果where子句已经存在,则删除where子句,并替换为"1=0“时,它会变得有点复杂。
如果用户输入的查询中的最后一个子句是where子句,那么根本没有问题,但是对于更复杂的查询,比如:
select
c.lastname,
sum(cs.amount)
from customersales cs
join customers c on c.idcustomer=cs.idcustomer
/* where 1=0 */
group by c.idcustomer, c.lastname通过使用"where SQL“方法,在前面的示例中插入它的唯一方法是使用一个功能相当强大的1=0解析器(请记住,用户可以输入复杂的查询,包括子查询等等),解析器可以知道在哪里包含这个字符串。
有没有人知道更好的方法呢?我不能使用"limit 1“,因为它必须是ANSI方式。
发布于 2009-12-18 04:35:18
如何在用户的SELECT周围添加您自己的SELECT?
SELECT * FROM (
select
c.lastname,
sum(cs.amount)
from customersales cs
join customers c on c.idcustomer=cs.idcustomer
/* where 1=0 */
group by c.idcustomer, c.lastname
) x
WHERE 0=1EDIT: ORDER BY不适用于该解决方案,但是由于您没有得到任何行,因此可以在必要时尝试将其从查询中删除。
发布于 2009-12-18 05:25:11
供将来参考,以防人们最终有不同的目标:请注意,使WHERE子句成为矛盾可能会导致优化器决定根本不执行子计划。因此,如果您需要查询的一些副作用(可能是预热缓存、执行过程等等),请注意。:-)
发布于 2009-12-18 05:25:16
如果您使用的是MSSQL Server,那么您可以将查询包含在SET FMTONLY中
SET FMTONLY ON SELECT * FROM tablename SET FMTONLY OFFhttps://stackoverflow.com/questions/1924335
复制相似问题