在Azure SQL数据仓库中找不到数据类型'ntext'错误

时间:2019-09-13 04:28:51

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

我正在使用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)")

我认为转义可以解决所有问题,但没有解决。有任何想法/见解吗?

2 个答案:

答案 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