0

これを実行すると

declare @short nchar(1) = '1';
declare @long nchar(5) = '123456';

select 'A' + CASE WHEN 1 = 1 THEN @short ELSE @long END + 'B'

私は結果を得る

-------
A1    B

SQL Server は、CASE コンストラクトの結果を可能な限り長い戻り値にパディングしているようです。これは、定数ではなく、変数を使用した場合にのみ発生します。

奇妙なことに、変数を明示的にトリムすると、結果は正しいです。

select 'A' + CASE WHEN 1 = 1 THEN rtrim(@short) ELSE @long END + 'B'

戻り値

----
A1B

これは仕様による動作ですか? サーバー設定でオフにすることはできますか?

4

1 に答える 1

0

式があるCASE場合、データ型の優先順位が引き継ぎます。ブランチ内のすべての式は、互換性のあるデータ型に変換されます。この場合、または のいずれかNCHAR(5)に収まるようにする必要があります。その後、関数を使用してデモンストレーションしたように、出力に影響を与えることができます。または、可能な出力ごとにすべてのデータ型または同じであることを確認できます。または、パディングを発生させないデータ型を使用します (の代わりに)。@short@longnvarcharnchar

于 2013-10-24T18:07:46.953 に答える