2017-02-21 32 views
2

我有两列的表,一个是Varchar类型和其他在NVarchar的。SQL服务器:为nvarchar为varchar

我想更新所有的行,以便VarcharField = NVarcharField。

它不会让我,因为某些行包含未在varchar列允许与当前代码页字符。

我怎样才能找到这些行?

是否可以删除不适合我使用的是特定的代码页中的任何字符?

SQL Server 2012的

+0

你真的想删除不支持的字符吗?你为什么需要这个? –

+0

我无法使用Nvarchar。 –

回答

1

如果因为你从TRY_CONVERT而不是预期的NULL得到问号Gordon's approach不起作用,试试这个方法:

SELECT IsConvertible = CASE WHEN NULLIF(REPLACE(TRY_CONVERT(varchar(max), N'人物'), '?',''), '') IS NULL 
         THEN 'No' ELSE 'Yes' END 

如果你需要它作为过滤器不能转换的行:

SELECT t.* 
FROM dbo.TableName t 
WHERE NULLIF(REPLACE(TRY_CONVERT(varchar(max), t.NVarcharField), '?',''), '') IS NULL 
4

您可以尝试转换的nvarchar()山坳到varchar()找到行:

select nvarcharcol 
from t 
where try_convert(varchar(max), nvarcharcol) is null; 
+2

它是否工作?因为当我使用它'try_convert'返回'??'不为空的中文字母。经过测试:'SELECT try_convert(varchar(max),N'人物')' –

+0

这个转换为什么会失败?这个答案对我来说没有意义。 – DavidG

+0

@TimSchmelter,也许你现在的代码页支持中文? –

2

试试这个..

与那些价值发现的行不支持varchar

declare @strText nvarchar(max) 
set @strText = 'Keep calm and say தமிழன்டா' 

select cast(@strText as varchar(max)) col1 , N'Keep calm and say தமிழன்டா' col2 

这里@strText有非英文字符,当您尝试cast到这一点varchar非英语字符变成????。所以col1col2是不相等的。

select nvar_col 
from tabl_name 
where nvar_col != cast(nvar_col as varchar(max)) 

是否可以删除不适合我使用的是特定的代码页中的任何字符?

update tabl_name 
    set nvar_col = replace(cast(nvar_col as varchar(max)),'?','') 
where nvar_col != cast(nvar_col as varchar(max)) 

与空字符串替换?和更新。