这个查询有什么问题,如何让它更有效?

时间:2013-05-17 12:48:36

标签: sql ms-access

我的ProjectNum column包含string data type。通常数字为X1234...,但如果没有分配编号,则必须自动生成一个编号,具体取决于分配给项目的优先级,取决于它是否以C or F开头。因此,自动生成的数字必须以C or F开头,后跟六位数字并自动递增。所以这是我的查询...

SELECT MAX(CINT(RIGHT(ProjectNum, 6))) AS LastDigits
FROM project_master_query
WHERE ((ProjectNum LIKE (IIF([@priorityDefID] = 4, "C*", "F*"))));

这允许我获取最后一个自动递增的数字,然后我可以通过添加1来自动生成代码中的数字。问题是,当我发送@priorityDefID of 4时(目前没有以“C”开头的数据库,我收到错误"This expression is typed incorrectly, or it is too complex to be evaluated.例如,数字表达式可能包含太多复杂的元素。尝试通过将表达式的一部分分配给变量来简化表达式。“

不太确定为什么这会导致我传递4,但是1,2或3工作正常并返回正确的值。我想的不是写MAX而只是抓住所有以C或F开头的东西然后抓住正确的6位数,按顺序下降并抓住前1位?

1 个答案:

答案 0 :(得分:1)

那个查询有很多问题,我不清楚一切都在发生,所以我不知道从哪里开始。但是,我可以警告您使用带有6位数的CInt()的危险。 CInt("999999")抛出溢出错误,因为最大整数值为32,767。使用CLng会更安全,因为最大长整数值是2,147,483,647 ...所以一个长整数将容纳所有可能的6位数值。

尽管该问题可能不会导致当前ProjectNum值出现问题,但是当您存储更多ProjectNum值时,这可能会让您感到厌烦。

关于“[错误消息]出现我传递4,但是1或2或3工作正常并返回正确的值”,此时您还说“数据库中没有以“C”开头的。这意味着查询在该情况下不返回任何行。我怀疑这会导致RIGHT(ProjectNum, 6)出现问题,因为Right(Null, 6)会触发无效使用Null 错误。

在添加以“C”开头的ProjectNum的行后,请检查错误是否消失。