2017-02-19 5 views
4

WHERE句を、特定の文字列変数がnullまたは空でない場所に書き込もうとしています。私が実行している問題は、空でない文字列がN''リテラルに等しいことです。例えば:私はWikipediaに集めることができるものから、空文字列を確認するSQL文 - T-SQL

declare @str nvarchar(max) = N'㴆'; 
select case when @str = N'' then 1 else 0 end; 

利回り1.、この特定のUnicode文字は、空の文字列と意味的に同じではない何かを、沈めるための絵文字です。また、文字列の長さは、少なくともT-SQLでは1です。

空の文字列のT-SQL変数をチェックする方が良い(正確な)方法はありますか?

+0

「値なし」のエントリは「NULL」である必要があります。 '@str is not null ... 'をチェックするのは本当に簡単です。 –

+0

アプリケーションは、このフィールドを「Do not modify this field」と「N'''」を示すために「NULL」を使用してこの値をNULLに更新します"この設計は意図的であり、変更を必要としないフィールドをデータ変更メッセージから省くことができる。 –

+0

意味:nvarcharの値がANSI STDかどうかを確認しますか? – McNets

答えて

6

を私は

問題が を設定し、「デフォルト」の照合(順序SQL_Latin1_General_CP1_CI_AS)ためであると説明したブログ、https://bbzippo.wordpress.com/2013/09/10/sql-server-collations-and-string-comparison-issues/

を見つけましたSQL Serverが正しく比較できないため いわゆる補助文字を含むUnicode文字列 (4バイト文字)。

修正は、補助文字に問題がない照合を使用することです。例:

select case when N'㴆' COLLATE Latin1_General_100_CI_AS_KS_WS = N'' then 1 else 0 end; 

は0を返します。その他の例については、ブログを参照してください。

空の文字列と比較するので、文字列の長さをテストする方法もあります。

declare @str1 nvarchar(max) =N'㴆'; 
select case when len(@str1) = 0 then 1 else 0 end; 

これは、期待どおりに0を返します。

これは、文字列がnullの場合も0を返します。

EDIT:devioさんのコメントに

おかげで、私は少し深く掘って補助文字をサポートしていないことに加えて、Latin1_General_CP1_CI_AS照合が処理されないことをErland Sommarskogからのコメントhttps://groups.google.com/forum/#!topic/microsoft.public.sqlserver.server/X8UhQaP9KF0

を見つけました新しいUnicode文字を正しく入力してください。だから私は㴆文字が新しいUnicode文字だと思っています。

照合Latin1_General_100_CI_ASを指定すると、この問題も解決されます。

+1

照合に関して正しいですが、 'select DATALENGTH(@str)'は2を返し、CAST AS VARBINARYは 'U + 3D06'を返します。したがって補助文字は返されません。 – devio

0

私が正しくあなたを理解している場合:

Select ...... 
where isnull(yourfield,'') != '' 
+1

これは正常に動作しますが、この場合OPにはデフォルトの照合で認識されないユニコード文字があり、テストは失敗します。 – DeanOC

関連する問題