SQLServer - 在使用EXCEPT / INTERSECT比较数据时排除NTEXT列

时间:2015-01-30 15:33:41

标签: sql sql-server-2008 ntext

在我的SQL中,我需要比较SQLServer 2008R2中两个表之间的数据,以返回存在不匹配的行(使用EXCEPT),同样在其他情况下匹配行(INTERSECT)。问题是,某些列具有NTEXT数据类型(SQLServer),并且当存在具有NTEXT列的此类表时,SQLServer会出错。

示例:

SELECT * FROM table_pre
EXCEPT
SELECT * FROM table_post

上述操作会出错 -

'The ntext data type cannot be selected as DISTINCT because it is not comparable.'

我认为表格(table_pretable_post)至少有一列数据类型= NTEXT导致比较失败。

问题 - 1.有没有办法从上面的比较中排除这些NTEXT列,而我不必明确列出列名并排除问题列?涉及大量列,明确列出并不容易。 2.我是否可以单独明确地转换/转换NTEXT列以表示VARCHAR,并且仍然不必列出其余列? 3.或者,一般来说,我可以通过在这种比较中列出那些列来某种方式排除某些列吗?

任何建议,真的很感激!感谢。

1 个答案:

答案 0 :(得分:1)

  

问题 - 1.是否有某种方法可以从上述比较中排除这些NTEXT列,

是的,明确使用列名。

  

没有我必须明确列出列名并排除问题列?

使用*是一个坏习惯,你滥用它就应该得到错误。

  

涉及大量列并且明确列出并不容易

实际上是微不足道的,建立dinamycally语句

  

我是否可以单独显式转换/转换NTEXT列以表示VARCHAR

没有。您必须转换为NVARCHAR,N 非常重要。但是,是的,你可以转换。

  
      
  1. 或者,一般情况下,我可以通过在比较期间列出某些列来排除某些列
  2.   

幸运的是没有。 SQL不会随机决定哪些列是或不是结果的一部分,因此您可以获得所需的可预测性。

所以,在结论中:

  • 从不使用*
  • 动态构建复杂语句。 SELECT ... FROM sys.columns是你的朋友,你可以轻松地在几秒钟内构建它
  • 抛弃deprecated TEXT, NTEXT and IMAGE种类