Sql MS Access“无效过程调用”将电子邮件地址的前半部分与另一个表中的电子邮件地址匹配

Sql MS Access“无效过程调用”将电子邮件地址的前半部分与另一个表中的电子邮件地址匹配,sql,ms-access,ms-access-2010,Sql,Ms Access,Ms Access 2010,在Access 2010 db中的表上运行下面的代码时,我遇到了一个无效的过程调用,但它在Access 2000 db中工作 我没有写这段代码,我知道它是在“@”符号前比较的文本,但我很想听听关于我在这里看到的特定语法的解释:LeftNzt1.Username,,InStrNzt1.Username,,“@'-1=LeftNzt2.email,,InStrNzt2.email,,“@'-1 虚假的 如果t1.Username为null,则返回一个空白字符串 现在,假设t1.Username是aa

在Access 2010 db中的表上运行下面的代码时,我遇到了一个无效的过程调用,但它在Access 2000 db中工作

我没有写这段代码,我知道它是在“@”符号前比较的文本,但我很想听听关于我在这里看到的特定语法的解释:LeftNzt1.Username,,InStrNzt1.Username,,“@'-1=LeftNzt2.email,,InStrNzt2.email,,“@'-1 虚假的


如果t1.Username为null,则返回一个空白字符串

现在,假设t1.Username是aa.gmail.com

然后InStrNzt1.Username,'@'-1将是3-1=2 因此,LeftNzt1.Username、、InStrNzt1.Username、'@'-1将保留为'aa.gmail.com',2=aa

因此,这个表达式基本上提取了@之前的电子邮件地址部分

LeftNzt2.email、、InStrNzt2.email、“@'-1对t2.email执行相同的操作

因此where子句将@之前的t1.username部分与@之前的t2.email部分进行比较


可能的错误原因:如果t1.Username或t2.email的格式不正确something@something,则instr将返回0。因此,leftsome字符串0可能会抛出错误,因为函数left期望值>=1作为第二个参数。

我在一个查询中使用它来解决类似的问题

Newfield: IIf(InStrRev([pullfield],"@"),Left([pullfield],InStrRev([pullfield],"(")-1),[pullfield])

它应该在@符号之前拆分,如果没有@,则只保留原始内容。

经过更多测试,如果电子邮件地址类似于a@gmail.com或者bob@@smith.com,所以我不确定问题出在哪里。
Newfield: IIf(InStrRev([pullfield],"@"),Left([pullfield],InStrRev([pullfield],"(")-1),[pullfield])