好吧,根据错误消息,你会认为这很简单(可能是…)
我在FoxPro 9.2数据库中使用IIF(immediate if)来评估表达式,然后根据表达式的评估方式执行两个操作之一(基本上,如果存在记录,则更新它;如果不存在,则插入它)。
IIF(
((SELECT COUNT(*) FROM tblName
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004') > 0),
(UPDATE tblName SET tblName.Desc = 'Me'
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004'),
(INSERT INTO tblName(Fldname, rCode, Desc)
VALUES ('FLDMy','000004','Me'))
)
这总是返回错误:"函数名称丢失)。"注意,所有的括号都匹配,所以它不会在任何地方丢失")"。单独的UPDATE和INSERT在单独运行时工作良好,所以我怀疑问题出在表达式(IIF中的第一条语句)上。
我正在从C#服务执行SQL,所以我希望能够在对FoxPro数据库的一次调用中进行检查和操作。
VFP IIF()可以返回"字符、数字、货币、日期或日期时间"。但它不能执行语句。我想尝试的是将IIF()封装在VFP EVALUATE()函数中。我还将使第二个和第三个参数返回UPDATE和INSERT语句的字符串。例如:
EVALUATE( IIF(.t., "UPDATE tblName SET tblname.desc = 'ME' WHERE fldname = 'FLDMy'", "INSERT INTO tblName(fldname) VALUES( 'FLDMy' ) " ) )
为了简洁起见,上面的例子是从你的陈述中缩写出来的。在这种情况下,上面的EVALUATE()将执行UPDATE语句。试试看。然后用你的完整陈述代替。
您混淆了VFP"SELECT";是一个(内置)SQL命令,一个用于更改当前工作区域的内置命令,也是一个返回当前所选工作区域编号的函数。
此外,IIF()是一个以表达式(计算为单个值的东西)为参数的函数。SQL SELECT和UPDATE命令并不能做到这一点,即使将它们封装在括号中也是如此。它实际上是基于第一个参数的值返回两个值中的一个,而不是用于控制流逻辑。我建议以IF的形式重写代码。。其他。。ENDIF块。
我尝试复制您在命令窗口中所做的操作,但收到了相同的错误。
x = ((SELECT COUNT(*) FROM tblName
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004') > 0)
返回错误"Function name is missing)"。执行查询,将其放入光标中,然后在_Tally>1 上执行If语句
SELECT COUNT(*) FROM tblName
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004' into cursor cTrash
If _Tally > 0
UPDATE tblName SET tblName.Desc = 'Me' WHERE tblName.Fldname = 'FLDMy'
AND tblName.rCode = '000004'
Else
INSERT INTO tblName(Fldname, rCode, Desc)
VALUES ('FLDMy','000004','Me')
EndIf