数据类型 nvarchar 和 ntext 在等于运算符中不兼容。 (402) (SQLExecDirectW)') || Sql炼金术,Sql蔚蓝

The data types nvarchar and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW)') || SqlAlchemy, Sql Azure

数据库版本:Microsoft SQL Azure (RTM) - 12.0.2000.8 2019 年 10 月 12 日 22:46:48 版权所有 (C) 2019 Microsoft Corporation

我有一个 sqlalchemy-orm 模型 Process,如下所示。

class Process(Base):
    __tablename__ = 'Process'
    id = Column(Integer, primary_key=True, autoincrement=True)
    process = Column(UnicodeText)
    process_length = Column(Integer)

我正在尝试 运行 以下查询以查找进程与字符串 sorted_json.

匹配的任何行
current_process = session.query(Process).filter(Process.process==sorted_json).one_or_none()

此查询 运行s 出错:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types nvarchar and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW)')

我尝试在后端将列 process 的数据类型更改为 ntext。当我 运行 查询时,它给出了一个奇怪的错误:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types ntext and ntext are incompatible in the equal to operator. (402) (SQLExecDirectW)')

需要注意的是sorted_json是一个非常长的json字符串,大约有4000个字符。我相信 sqlalchemy 在查询时将此字符串转换为 ntext。

我尝试了 sqlalchemy 的 like 函数,例如:

current_process = session.query(Process).filter(Process.process.like(sorted_json)).one_or_none()

这里没有错误,但是当有实际匹配时它没有提供匹配。

感谢任何帮助!

通过在 orm 查询中将 sorted_json 字符串转换为 NVARCHAR 部分解决了该问题,例如:

from sqlalchemy import cast, NVARCHAR
session.query(Process).filter(Process.process==cast(sorted_json,NVARCHAR)).one_or_none()

如@GordThomson 所述,问题出在 odbc 驱动程序端。这里提到了这个问题:github.com/mkleehammer/pyodbc/issues/620