SQL Server:Nvarchar到Varchar

时间:2017-02-21 12:23:49

标签: sql sql-server sql-server-2012

我有一个包含两列的表,一列是Varchar,另一列是NVarchar

我想更新所有行,因此VarcharField = NVarcharField。

它不会让我,因为有些行包含varchar列中不允许使用当前代码页的字符。

如何找到这些行?

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

SQL Server 2012。

3 个答案:

答案 0 :(得分:4)

您可以尝试将nvarchar() col转换为varchar()来找到行:

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

答案 1 :(得分:3)

试试这个..

查找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))

?替换为空字符串并更新它们。

答案 2 :(得分:2)

如果Gordon's approach因您从TRY_CONVERT而不是预期NULL收到问号而无效,请尝试以下方法:

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