【问题标题】:SQLServer - Exclude NTEXT columns while comparing data using EXCEPT/INTERSECTSQLServer - 在使用 EXCEPT/INTERSECT 比较数据时排除 NTEXT 列
【发布时间】:2015-03-30 03:07:54
【问题描述】:

在我的 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. 或者,一般来说,我可以通过在此类比较中列出某些列来排除某些列吗?

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

【问题讨论】:

标签: sql sql-server-2008 ntext


【解决方案1】:

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

是的,明确使用列名。

我不必明确列出列名并排除问题列?

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

涉及的列多,明确列出并不容易

其实很简单,用动态构建语句

我可以单独显式地转换/转换 NTEXT 列来表示 VARCHAR

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

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

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

所以,结论是:

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

【讨论】:

  • 谢谢莱姆斯。那我看看程序化的方式吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2016-04-26
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多