VFP sql预通过

时间:2012-03-28 15:55:04

标签: sql tsql visual-foxpro pass-through

我不知道它的官方名称是什么,所以也许这就是为什么我在网上找不到任何东西。 基本上,当你在vfp中使用sql时,它会执行初始传递(有时是2?)而不移动记录光标或保存结果。 不幸的是,我在我的sql中有子例程,在初始传递期间运行和更改事物。

为什么我在sql查询中使用子程序?因为vfp不支持在选择项内的子查询外引用(再次我不知道正式名称)。

示例:select id, (select detail.name from detail where master.id == detail.id) name from master

这确实有效:select id, getname(id) from master

其中getname()是包含第一个示例中的sql的子例程。

你也可以使用连接,但上面只是一个例子,连接在我的情况下不起作用。

有没有办法处理初始传递? vfp是否会创建像firstpass之类的布尔值?我想我可以为我的子程序添加一个计数,但这看起来比现在更加混乱。

或者有人可以解释或链接我对vfp初始通行证的解释吗?我相信它之前只进行了一次初始传递,但现在它在更改了一些代码之后做了两次。

编辑:好的,我错了。上面的例子确实有效。什么不起作用如下:
SELECT d2.id, (SELECT TOP 1 d1.lname l FROM dpadd d1 WHERE d1.id== d2.id ORDER BY l) FROM dpadd d2
它给了我一个“SQL:不支持这种类型的查询”错误 奇怪的是,如果我做以下事情,它会起作用:
SELECT d2.id, (SELECT COUNT(d1.lname) FROM dpadd d1 WHERE d1.id == d2.id) FROM dpadd d2

关于子程序,它们是我的形式的方法。数据库是本地.dbf文件。我没有与任何服务器交互,只是使用into cursor子句运行直接sql命令,然后生成报告(通常)。

我将在几分钟后回复一个实际有用的选择语句“不支持”。我确定您已经注意到top 1示例完全没用。

1 个答案:

答案 0 :(得分:0)

在预测中似乎不允许使用TOP。对于该示例,您可以改为:

SELECT d2.id, (SELECT MAX(d1.lname) l FROM dpadd d1 WHERE d1.id== d2.id) FROM dpadd d2

还有什么能给你带来麻烦?