【问题标题】:Cannot find data type 'ntext' error in Azure SQL Data Warehouse在 Azure SQL 数据仓库中找不到数据类型“ntext”错误
【发布时间】:2019-09-13 04:28:51
【问题描述】:

我正在使用 pyodbc 对 Azure SQL 数据仓库运行 UPDATE 语句:

cursor.execute(
  "UPDATE dbo.test SET desc = ? WHERE id = ?", desc, id
)

当 desc 值很简单时,这可以正常工作。但是当desc的值比较复杂(文本较长)时,执行上面会吐出如下错误:

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]104220;
Cannot find data type 'ntext'. (100000) (SQLExecDirectW)")

我认为转义可以解决任何问题,但事实并非如此。有什么想法/见解吗?

【问题讨论】:

    标签: tsql pyodbc azure-sql-data-warehouse


    【解决方案1】:

    你可以试试这个:

    cursor.execute(
      "UPDATE dbo.test SET desc = CAST(? AS NVARCHAR(MAX)) WHERE id = ?", desc, id
    )
    

    我猜 pyodbc 以某种方式将大字符串转换为 ntext

    如果这没有帮助,请检查以下github link - 它可能会对您有所帮助,因为它解释了如果:

    您正在使用旧的 SQL Server (WDAC) 驱动程序,该驱动程序将 nvarchar 视为 ntext 这就是您遇到问题的原因,因为没有 在 django-pyodbc-azure 中引用 ntext 类型

    【讨论】:

    【解决方案2】:

    更新 - 2022-02-21:

    ODBC Driver 18 for SQL Server 添加了一个LongAsMax 连接字符串参数,因此我们可以告诉驱动程序将长类型映射为更现代的*(max) 类型,而不是旧的TEXT/NTEXT/IMAGE 类型。更多信息here.


    正如相关的GitHub issue 中所建议的,解决方法是使用setinputsizes 作为 ODBC 驱动程序的提示:

    # test data
    desc = ' '.join(['abcde' for x in range(2000)])
    
    crsr.setinputsizes([(pyodbc.SQL_WVARCHAR, 0), (pyodbc.SQL_INTEGER,)])
    crsr.execute("UPDATE ##test SET [desc]=? WHERE id=?", desc, id)
    

    有驱动发送的效果

    exec sp_prepare @p1 output,N'@P1 nvarchar(max),@P2 int',N'UPDATE ##test SET [desc]=@P1 WHERE id=@P2',1
    

    而不是

    exec sp_prepare @p1 output,N'@P1 ntext,@P2 int',N'UPDATE ##test SET [desc]=@P1 WHERE id=@P2',1
    

    【讨论】:

    • 当我执行存储过程并向其发送参数时,这不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    相关资源
    最近更新 更多