我在MS Access中使用SQL从表中检索数据,但取决于我是运行查询还是使用VBA,我为同一个查询得到两个不同的结果。为什么我的SQL查询返回两个不同的结果?
很简单,我想从表中的单个列的最大值。麻烦的是,我认为列数据类型是文本?该表格主要由6位数字组成,其中包含其他格式,如“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,2,3, 4,5,10,111,123,345,4000等数字的顺序为文本:1,10,11,111,2 ,23,3,4,5,8,89等。max和数字存储为文本不能很好地工作...访问知道这一点,但喜欢做错误的事情无论如何。转换为int然后找到最大值 – Twelfth
不确定,但查询生成器和ADODB之间的通配符char可能会不同?我认为你可能不得不使用下划线,否则尝试使用'NOT LIKE'% - %'',它将删除任何破折号。 – JohnRC