0

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

例子:

SELECT * FROM table_pre
EXCEPT
SELECT * FROM table_post

上述操作报错——

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

我相信表 ( table_pre, table_post) 至少有一列 datatype =NTEXT导致比较失败。

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

任何建议,非常感谢!谢谢。

4

1 回答 1

1

问题 - 1. 有没有办法从上述比较中排除这些 NTEXT 列,

是的,明确使用列名。

无需我明确列出列名并排除问题列?

使用 * 是一个坏习惯,你应该因为滥用它而犯错。

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

实际上是微不足道的,以动态方式构建语句

我可以单独显式转换/转换 NTEXT 列以说 VARCHAR

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

  1. 或者,一般来说,我是否可以通过在此类比较期间列出某些列来排除某些列

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

所以,结论是:

  • 从不使用*
  • 动态构建复杂的语句。SELECT ... FROM sys.columns 是您的朋友,您可以在几秒钟内轻松构建它
  • 抛弃已弃用的 TEXT、NTEXT 和 IMAGE类型
于 2015-01-30T15:39:40.853 回答