当在访问2010 db中运行以下代码时,我正在遇到"无效的过程调用",但它在Access 2000 dB中起作用。
我没有编写此代码,我知道它是在"@'符号之前对文本进行编译,但我很想听听我在这里看的特定语法的解释:"左(nz(t1)。用户名,'),inst(nz(t1.username,''),'@') - 1)=左(nz(t2.email,''),instr(nz(t2.email,''),'@') - 1) )<> false));"
SELECT
t1.ID,
t1.Username AS Email
FROM USERS AS t1
WHERE (((Exists (SELECT *
FROM LICENSE AS t2
WHERE Left(Nz(t1.Username,''),InStr(Nz(t1.Username,''),'@')-1) = Left(Nz(t2.email,''),InStr(Nz(t2.email,''),'@')-1)
))<>False));
nz(t1.username,'')如果t1.username为null。
现在,假设t1.username是aa.gmail.com
然后inst(nz(t1.username,''),'@') - 1将是3-1 = 2因此,左(nz(t1.username,''),instr(nz(t1.username,''),'@') - 1)将留下('aa.gmail.com',2),2)= aa
所以,此表达式基本上是在@。
之前提取电子邮件地址的一部分left(nz(t2.email,''),inst(nz(t2.email,''),'@') - 1)在t2.email
因此,在 @ @。
可能的错误原因:如果t1.username或t2.email不是form@exptshing@tosings@theings,则仪器将返回0。因此,左(某些字符串,0)可能是在函数左侧的函数期望值> = 1作为第二个参数时,将错误投掷。
我在查询中使用了此问题来解决我的类似问题。
Newfield: IIf(InStrRev([pullfield],"@"),Left([pullfield],InStrRev([pullfield],"(")-1),[pullfield])
它应该在"@"符号之前将其拆分,如果没有"@",则它只是将原始内容留在那里。