我一直致力于从 SQLITE 切换到 Interbase 数据库。我遇到的问题之一是“错误的参数号”错误。因此,我回到 Embarcadero 提供的示例数据库之一(EMPLOYEE)尝试各种 SQL 命令来重现该问题。
所以这里有一个场景:我想要一个查询,给出特定客户的所有销售超过预先指定金额的平均销售额。因此,这是一个适用于此的查询:
SELECT AVG(TOTAL_VALUE) AS AvgSales
FROM SALES
WHERE TOTAL_VALUE > :TOTAL_VALUE
AND CUST_NO = :CUSTNO
现在,我想将该平均值存储在表中。但你怎么能这么做呢?这是我尝试过的:
UPDATE <table>
SET <Column> = (SELECT AVG(TOTAL_VALUE) AS AvgSales
FROM SALES
WHERE TOTAL_VALUE > :TOTAL_VALUE
AND CUST_NO = :CUST_NO)
但是当你尝试执行它时,它会给出错误消息“错误的参数号”
如果您对这两个参数进行硬编码,则效果很好:
UPDATE <table>
SET <Column> = (SELECT AVG(TOTAL_VALUE) AS AvgSales
FROM SALES
WHERE TOTAL_VALUE > 10000
AND CUST_NO = 1001)
经过更多实验,在我看来,子查询中的任何参数都会生成相同的错误消息而不是执行。例如,这也会生成相同的错误消息(并且对参数进行硬编码):
SELECT AMT
FROM
(SELECT AVG(TOTAL_VALUE) AS AvgSales
FROM SALES
WHERE TOTAL_VALUE > :TOTAL_VALUE
AND CUST_NO = :CUSTNO
) X(Amt)
那么,如何将这样的值存储在 Interbase 表中?
不幸的是,我们无法重现运行我们没有的源代码的问题。
无论如何,在这种情况下,查看您的查询,您可以简单地分两步拆分并运行查询:
在 SQL-server 中,我们可以通过使用变量来回避这个问题:
declare @i int
select @i = :CUST_NO
select * from sales where CUST_NO = @i