如何修复SQL错误[306] [S0002]:除非使用IS NULL或LIKE运算符,否则无法比较或排序text,ntext和image数据类型?

时间:2018-12-21 11:10:57

标签: casting sql-server-2017

使用“ =”(等于运算符)比较sql server文本数据类型时出现问题。 这是我的查询样子

 SELECT * FROM dbeplanningv3.dbo.usulan_dpr
 WHERE  CONVERT(VARCHAR, evaluasi) is null 
 or 
 trim(CONVERT(VARCHAR, evaluasi)) = '' ORDER BY [detail] ASC OFFSET 0 ROWS  
 FETCH NEXT 10 ROWS ONLY

如您在我上面的脚本中看到的。我正在使用此CONVERT(VARCHAR, evaluasi)进行数据类型转换 但仍然无法正常工作,并且出现错误SQL Error [306] [S0002]: The text, ntext, and image data types cannot be compared or sorted, 这是我表结构的一部分 table usulan_dpr 请帮助我

1 个答案:

答案 0 :(得分:1)

在您的查询中:

SELECT * FROM dbeplanningv3.dbo.usulan_dpr
WHERE  CONVERT(VARCHAR, evaluasi) is null 
or 
trim(CONVERT(VARCHAR, evaluasi)) = '' ORDER BY [detail] ASC OFFSET 0 ROWS  
FETCH NEXT 10 ROWS ONLY

只有ORDER BY [detail]会导致此错误,因此我将假设[detail]的类型为text(此列在您的屏幕截图中不可见)。为避免该错误,应将其转换为varchar(max):

SELECT * FROM dbeplanningv3.dbo.usulan_dpr
WHERE  CONVERT(VARCHAR, evaluasi) is null 
or 
trim(CONVERT(VARCHAR, evaluasi)) = '' ORDER BY convert(varchar(max), [detail]) ASC OFFSET 0 ROWS  
FETCH NEXT 10 ROWS ONLY

但是重要的问题是,为什么在SQL Server 2012上仍然使用text数据类型?您应该将它们转换为varchar(max),并避免一直投射它们。

此外,强制转换CONVERT(VARCHAR, evaluasi) is null是毫无意义的。您可以直接检查evaluasi is null