为什么我的SQL查询会返回两个不同的结果?

时间:2017-10-12 19:18:41

标签: sql vba ms-access

我在MS Access中使用SQL从表中检索数据但是根据我是运行查询还是使用VBA,我得到两个不同的结果用于同一查询。

很简单,我想要表格中单个列的最大值。我认为问题是列数据类型是文本吗?该表主要由6位数字组成,其中散布着其他格式,例如&x; xx-xxxxx'。

首先,我需要能够在VBA中执行此操作,所以我有这个:

Private Function Create() As String

Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection
Dim strSQL As String

Set cn = CurrentProject.Connection
cn.CursorLocation = adUseClient

strSQL = "SELECT Max(par.PN) AS PN FROM par WHERE ((PN Between CLng('100000') And CLng('999999')) And (PN Not Like '##-#####'));"

Set rs = cn.Execute(strSQL)

If (rs.RecordCount > 0) Then
    'Create = rs("PN")
    Debug.Print rs("PN")
End If

End Function

结果是10-0000,所以我的第一个问题是查询错误,所以我转到查询构建器并输入:

SELECT Max(par.PN) AS PN   
FROM par 
WHERE ((PN Between CLng('100000') And CLng('999999')) And (PN Not Like '##-#####'));

在运行时返回745864。所以从这里可以看出这里有些不妥。

现在,让我感到震惊的另一件事是,我不认为我需要And (PN Not Like '##-#####')才能得到一个六位数字,尽管WHERE ((PN Between CLng('100000') And CLng('999999'))已经足够了...

我怀疑这是因为数字存储为文本,因此,在函数之间不会对文本起作用 - 如果确实如此,我会进一步预期CLng函数会成功转换为数字,以便此查询起作用。

无论如何,我需要能够使用vba获取最新的六位数字。任何人都可以解决问题所在吗?

由于

1 个答案:

答案 0 :(得分:0)

ADO SQL使用ANSI 92版本的LIKE运算符(允许使用通配符:_表示单个字符,%表示多个字符。)

MS Access和DAO使用不同形式的LIKE运算符(有关允许的通配符,请参阅this MSDN page

如果您想使用这样的比较,我建议您切换到DAO(如果您没有特定的理由使用ADO)

另一种方法(以及我喜欢的方法)是将PN转换为实际数字:

SELECT Max(CLng(Replace(par.PN, "-", ""))) AS PN 
FROM par 
WHERE CLng(Replace(par.PN, "-", "")) Between 100000 And 999999