在SQL Server Management Studio中,我可以运行此查询:
select a.foo, colX, colY, colZ from tblA a
join tblB b
on (a.foo = b.foo)
在python脚本中通过pyodbc运行相同的查询,我得到:
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][
SQL Server]"b" is not a recognized table hints option. If it is intended as a p
arameter to a table-valued function or to the CHANGETABLE function, ensure that
your database compatibility mode is set to 90. (321) (SQLExecDirectW)')
谁能解释为什么这个查询直接适用于SQL Server,但在使用pyodbc时表别名似乎有问题?
这是我能够发现的:
- 在 Microsoft Windows NT 6.1 (7601) 上运行的 SQL Server
- SQL Server 版本是 11.0.5532.0 pyodbc
- 库:pyodbc-3.0.7.win32-py2.7
1)我不知道如何生成可重现的示例,而且我不是DBA;我几乎可以在SQL中过得去。2) 我无法在此数据库上创建表。但是:我可以使用 RODBC r 包和针对同一数据库的 sqlQuery() 调用来执行具有 3 个连接/3 个别名的完整查询。因此,罪魁祸首是pyodbc,所以我将尝试找到一个python开发人员来尝试重现并回发调查结果。
UPDATE + FIX
此问题是由串联错误引起的:
在用python执行之前,得到了python开发人员的帮助来查找和打印原始sql:
select a.foo, colX, colY, colZ from tblA a join tblB bon (a.foo = b.foo)
。以及每个连接时的类似问题,由 SQL 字符串中缺少空格引起:
sql = "select a.foo, colX, colY, colZ from tblA a "
sql += "join tblB" #no whitespace at end of string
sql += "on (a.foo = b.foo)" #runs into next segment.
使用 RODBC 在 r 中工作,因为 r 中的字符串构建如下:
sql = "
...full query...
"
。没有出现串联错误的机会。