如何判断列是否可以从nVarChar变为varChar?

Jon*_*len 1 t-sql sql-server

我正在寻找一种方法来确定列是否包含任何非ASCII数据,以便我无法将其从nVarChar转换为varChar.

理想情况下,我想在T-SQL中执行此操作.

Pரத*_*ீப் 7

一种简单的方法是转换为 varchar

select * 
from yourtable 
where nvarcharcolumn <> cast(nvarcharcolumn as varchar(8000))  
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 5

目前的另一个答案是缺少一步.所有它检查的是,在转换为varchar它们仍然比较相等 - 而不是它们实际上是相同的字符.

字符串N'?????'将无声地转换为'4"*8?'并且在许多排序规则下仍然相等.

看到

SELECT nvarcharcolumn,
       CAST(nvarcharcolumn AS VARCHAR(4000))
FROM   ( VALUES(N'?????')) V(nvarcharcolumn )
WHERE  nvarcharcolumn <> cast(nvarcharcolumn AS VARCHAR(4000)) 
Run Code Online (Sandbox Code Playgroud)

我会检查它在转换到varchar并再次返回后往返到完全相同的值.你可以这样做

WHERE nvarcharcolumn <> cast(nvarcharcolumn as varchar(4000)) collate Latin1_General_100_BIN 
Run Code Online (Sandbox Code Playgroud)