我创建了使用cursor.execute方法调用的此过程。我遇到的问题是PYODBC看到的参数比我给的要多。在此示例查询中,PYODBC将“ -”和“-”作为附加参数读取。有谁知道为什么会这样吗?每当我在Access中进行任何字符串连接时,都会发生这种情况。
def GetAccessResults(self):
with pyodbc.connect(SQL.DBPath) as con:
cursor = con.cursor()
if self.parameters == None:
cursor.execute('{{Call {}}}'.format(self.storedProc))
else:
callString = self.__CreateStoredProcString()
cursor.execute(callString, self.parameters)
returnValue = cursor.fetchall()
return returnValue
def __CreateStoredProcString(self):
questionMarks = ('?,' * len(self.parameters))[:-1]
return '{{Call {} ({})}}'.format(self.storedProc, questionMarks)
尝试使用与号:
Select "*-" & Service_Abbreviation & "-*"
此外,Like需要用引号引起来的字符串,并且子查询不会返回该字符串。所以也许:
Select "'*-" & Service_Abbreviation & "-*'"
正如OP所发现的,MS Access既是前端GUI应用程序又是后端数据库,在运行SQL时的运行方式有所不同。通常,后端模式倾向于更接近标准SQL,即:
LIKE
的通配符使用%
,而GUI使用*
,除非在使用标准SQL Server compatible syntax (ANSI 92)的%
中运行Access数据库。因此,请考虑将Access'ALIKE
(类似于ANSI)与%
在两种Access模式下都兼容。LIKE
会将一个标量评估为另一个标量。实际上,如果子查询返回的行多于当前设置可能发生的情况,Access将会出错。 错误3354:此子查询最多可以返回一条记录
[在其他数据库中,评估在子查询的第一行(没有ORDER BY
的可以是随机行)上运行,而不是在子查询的所有记录上运行。相反,请考虑将SQL重构为我们的EXISTS
子句:
PARAMETERS prmServiceName Tex(255);
SELECT c.*
FROM Charts c
WHERE EXISTS
(SELECT 1
FROM Services s
WHERE s.ServiceName = prmService_Name
AND c.FileName LIKE '*-' & s.Service_Abbreviation & '-*');