SQL Severにおいて、ntext型の比較はメンド臭い。
select * from SAMPLE_TABLE where NTEXT_COLUMN = ‘condition_value’
とやるとデータ型 ntext と varchar は not equal to 演算子では互換性がありません。
となる…イケてない
正攻法として
select
*
from
SAMPLE_TABLE
where
cast(NTEXT_COLUMN as nvarchar(max)) = 'condition_value'
してもいいのだけど…何か面倒じゃない。そう諦めていたけど、一応ググってみると
sql - What’s the right way to compare an NTEXT column with a constant value? - Stack Overflow
LIKE
っという手段を発見
select
*
from
SAMPLE_TABLE
where
NTEXT_COLUMN like 'condition_value'
実行計画見ると、一応違いがある。当たり前にcastしたやつはconvertの処理が入ってる。
cast
SHOWPLAN_ALL (0.415)
+-Filter(WHERE:([Expr1003]=CONVERT_IMPLICIT(nvarchar(max),'condition_value',0))) (0.415)
+-Compute Scalar(DEFINE:([Expr1003]=CONVERT(nvarchar(max),[DB].[SCHEMA].[SAMPLE_TABLE].[NTEXT_COLUMN],0))) (0.414)
+-Clustered Index Scan(OBJECT:([DB].[SCHEMA].[SAMPLE_TABLE].[PK_SAMPLE_TABLE])) (0.414)
like
SHOWPLAN_ALL (0.415)
+-Filter(WHERE:([DB].[SCHEMA].[SAMPLE_TABLE].[NTEXT_COLUMN] like N'condition_value')) (0.415)
+-Clustered Index Scan(OBJECT:([DB].[SCHEMA].[SAMPLE_TABLE].[PK_SAMPLE_TABLE])) (0.414)
パフォーマンスとかどうなんだろうな。LIKE
が気持ち悪いというのも分かる。でも、動的なSQLを作り上げなきゃいれない場合だと、ntextの処理入れるの面倒で、LIKE
でやってしまいそうだ。