2017-02-19 59 views
4

我想寫一個WHERE子句,用於某個字符串變量不爲空或空的位置。我遇到的問題是某些非空字符串等於N''文字。例如:用於檢查空字符串的SQL語句 - T-SQL

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

息率1。從我可以收集Wikipedia,這個特殊的Unicode字符是淹沒的東西,這不是語義上等於一個空字符串象形文字。此外,字符串長度爲1,至少在T-SQL中。

是否有更好的(準確的)方法來檢查空字符串的T-SQL變量?

+0

「無值」條目應爲「NULL」。然後真的很容易檢查:'@str不爲空...' –

+0

該應用程序的問題是使用'NULL'來表示「不要修改此字段」和「N''表示」將此值更新爲NULL 」。該設計是故意的,以便不需要修改的字段可以從數據修改消息中省略。 –

+0

您的意思是:檢查nvarchar的值是否爲ANSI STD? – McNets

回答

6

我發現了一個博客,https://bbzippo.wordpress.com/2013/09/10/sql-server-collations-and-string-comparison-issues/

對此解釋稱

的問題是,因爲「默認」排序規則設置 (SQL_Latin1_General_CP1_CI_AS) for 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,如預期。

當字符串爲空時,這也會產生0。

編輯:

由於devio的評論,我挖了一個深一點,發現從厄蘭Sommarskog https://groups.google.com/forum/#!topic/microsoft.public.sqlserver.server/X8UhQaP9KF0

,除了不支持增補字符,則Latin1_General_CP1_CI_AS整理不處理評論新的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有一個unicode字符,默認排序規則無法識別並且測試失敗。 – DeanOC