You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyODBC(pypyodbc)SQL Server多WHERE条件参数传递报错排查

Windows下pypyodbc操作SQL Server多参数WHERE条件报错问题

在Windows环境下使用pypyodbc操作SQL Server,编写包含JOIN和两个WHERE条件的SELECT语句时,单独使用任一参数化WHERE条件查询正常,但用AND组合两个条件就触发报错。

单独参数查询正常的代码

bhfc_cursor.execute("""\
    select inc_auth.staff_id, inc_auth.rank, inc_auth.assignment, inc_auth.dttm from INC_AUTH
     INNER JOIN INC_MAIN ON inc_auth.inci_id = inc_main.inci_id
      where inc_main.inci_id = (?) """, this_incid)
mutual_aid_fdid = bhfc_cursor.fetchone()

bhfc_cursor.execute("""\
    select inc_auth.staff_id, inc_auth.rank, inc_auth.assignment, inc_auth.dttm from INC_AUTH
     INNER JOIN INC_MAIN ON inc_auth.inci_id = inc_main.inci_id
      where inc_auth.auth_type = (?) """, auth_type)
mutual_aid_fdid = bhfc_cursor.fetchone()

组合条件报错的代码

bhfc_cursor.execute("""\
    select inc_auth.staff_id, inc_auth.rank, inc_auth.assignment, inc_auth.dttm from INC_AUTH
     INNER JOIN INC_MAIN ON inc_auth.inci_id = inc_main.inci_id
      where inc_auth.auth_type = (?) and inc_main.inci_id = (?) """, auth_type, this_incid)
mutual_aid_fdid = bhfc_cursor.fetchone()

错误信息

File "C:\Users\bucky\OneDrive\Python_Installs\PycharmProjects\ReadSQLWireNFIRS\ReadSQQLWriteNFIRS.py", line 228, in <module>
    bhfc_cursor.execute("""\
File "C:\Users\bucky\OneDrive\Python_Installs\PycharmProjects\ReadSQLWireNFIRS\Lib\site-packages\pypyodbc.py", line 1617, in execute
    check_success(self, ret)
File "C:\Users\bucky\OneDrive\Python_Installs\PycharmProjects\ReadSQLWireNFIRS\Lib\site-packages\pypyodbc.py", line 1007, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
File "C:\Users\bucky\OneDrive\Python_Installs\PycharmProjects\ReadSQLWireNFIRS\Lib\site-packages\pypyodbc.py", line 987, in ctrl_err
    raise DatabaseError(state,err_text)
pypyodbc.DatabaseError: ('07002', '[07002] [Microsoft][ODBC SQL Server Driver]COUNT field incorrect or syntax error')

排查尝试

  • 已尝试改用%s替代(?)、将变量转为列表/元组等方法,均无效
  • 变量类型:inci_id为<class 'pypyodbc.TupleRow..Row'>,auth_type为<class 'list'>
  • 移除JOIN直接查询INC_AUTH表,仍报相同错误
  • 将其中一个变量替换为常量后查询正常,证明问题出在变量替换而非语句本身:
bhfc_cursor.execute("""\
select inc_auth.staff_id, inc_auth.rank, inc_auth.assignment, inc_auth.dttm from INC_AUTH
  where (inc_auth.auth_type = 'OC' ) AND (inc_auth.inci_id = (?) ) """, this_incid)
oic_details = bhfc_cursor.fetchone()

相关ODBC日志片段

ReadSQQLWriteNF fb68-77d0   ENTER SQLPrepareW 
        HSTMT               0x000001CEFFC70470
        WCHAR *             0x000001CEFF370570 [     164] "    select inc_auth.staff_id, inc_auth.rank, inc_auth.assignment, inc_auth.dttm from INC_AUTH\ a      where (inc_auth.auth_type = (?) ) AND (inc_auth.inci_id = (?) ) "
        SDWORD                   164

ReadSQQLWriteNF fb68-77d0   EXIT  SQLPrepareW  with return code 0 (SQL_SUCCESS)
        HSTMT               0x000001CEFFC70470
        WCHAR *             0x000001CEFF370570 [     164] "    select inc_auth.staff_id, inc_auth.rank, inc_auth.assignment, inc_auth.dttm from INC_AUTH\ a      where (inc_auth.auth_type = (?) ) AND (inc_auth.inci_id = (?) ) "
        SDWORD                   164

ReadSQQLWriteNF fb68-77d0   ENTER SQLNumParams 
        HSTMT               0x000001CEFFC70470
        SWORD *             0x000001CEFF3B3C98

ReadSQQLWriteNF fb68-77d0   EXIT  SQLNumParams  with return code 0 (SQL_SUCCESS)
        HSTMT               0x000001CEFFC70470
        SWORD *             0x000001CEFF3B3C98 (2)

ReadSQQLWriteNF fb68-77d0   ENTER SQLDescribeParam 
        HSTMT               0x000001CEFFC70470
        UWORD                        1 
        SWORD *             0x000001CEFF3B3398
        SQLULEN *           0x000001CEFF3B3918
        SWORD *             0x000001CEFF3B3518
        SWORD *             0x000001CEFF3B3718

ReadSQQLWriteNF fb68-77d0   EXIT  SQLDescribeParam  with return code 0 (SQL_SUCCESS)
        HSTMT               0x000001CEFFC70470
        UWORD                        1 
        SWORD *             0x000001CEFF3B3398 (-9)
        SQLULEN *           0x000001CEFF3B3918 (255)
        SWORD *             0x000001CEFF3B3518 (0)
        SWORD *             0x000001CEFF3B3718 (1)

ReadSQQLWriteNF fb68-77d0   ENTER SQLDescribeParam 
        HSTMT               0x000001CEFFC70470
        UWORD                        2 
        SWORD *             0x000001CEFF3B3798
        SQLULEN *           0x000001CEFF3B3398
        SWORD *             0x000001CEFF3B3918
        SWORD *             0x000001CEFF3B3518

ReadSQQLWriteNF fb68-77d0   EXIT  SQLDescribeParam  with return code -1 (SQL_ERROR)
        HSTMT               0x000001CEFFC70470
        UWORD                        2 
        SWORD *             0x000001CEFF3B3798
        SQLULEN *           0x000001CEFF3B3398
        SWORD *             0x000001CEFF3B3918
        SWORD *             0x000001CEFF3B3518

        DIAG [07009] [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index (0) 

ReadSQQLWriteNF fb68-77d0   ENTER SQLGetDiagRecW 
        SQLSMALLINT                  3 <SQL_HANDLE_STMT>
        SQLHANDLE           0x000001CEFFC70470
        SQLSMALLINT                  1 
        SQLWCHAR *          0x000001CEFF31A070
        SQLINTEGER *        0x000001CEFF3B2818
        SQLWCHAR *          0x000001CEFF2704E0 
        SQLSMALLINT               1024 
        SQLSMALLINT *       0x000001CEFF3B2618

ReadSQQLWriteNF fb68-77d0   EXIT  SQLGetDiagRecW  with return code 0 (SQL_SUCCESS)
        SQLSMALLINT                  3 <SQL_HANDLE_STMT>
        SQLHANDLE           0x000001CEFFC70470
        SQLSMALLINT                  1 
        SQLWCHAR *          0x000001CEFF31A070 [       5] "07009"
        SQLINTEGER *        0x000001CEFF3B2818 (0)
        SQLWCHAR *          0x000001CEFF2704E0 [      59] "[Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index"
        SQLSMALLINT               1024 
        SQLSMALLINT *       0x000001CEFF3B2618 (59)

内容的提问来源于stack exchange,提问作者buckyswider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:40:38