好的,根据错误信息,您会认为这很简单(可能是......)。
我在FoxPro 9.2数据库中使用IIF(立即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数据库中进行检查和操作。
答案 0 :(得分:3)
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语句。试一试。然后用你的完整陈述代替。
答案 1 :(得分:0)
你让VFP感到困惑。 “SELECT”是一个(内置)SQL命令,一个用于更改当前工作区的内置命令,它也是一个返回当前所选工作区编号的函数。
此外,IIF()是一个将表达式(评估为单个值)作为参数的函数。即使将它们包装在括号中,SQL SELECT和UPDATE命令也不会这样做。它实际上是根据第一个参数的值返回两个值中的一个 - 它实际上不适用于控制流逻辑。我建议以IF .. THEN .. ENDIF块的形式重写代码。
答案 2 :(得分:0)
我尝试在命令窗口中复制您正在执行的操作并收到相同的错误。
x = ((SELECT COUNT(*) FROM tblName
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004') > 0)
返回错误“缺少函数名称。”执行您的查询,将其抛入游标并在_Tally>上执行If语句1
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