我正在使用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)")
我认为转义可以解决所有问题,但没有解决。有任何想法/见解吗?
答案 0 :(得分:2)
您能尝试一下吗?
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类型的引用
答案 1 :(得分:1)
如相关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