SQL Server:将Nvarchar转换为Varchar。

3
我有一张表格,包含两列,一列是Varchar类型,另一列是NVarchar类型。我想要更新所有行,让VarcharField等于NVarcharField
但是由于某些行的字符不符合当前代码页下Varchar列的规定,导致我无法完成更新操作。请问如何查找这些行?
是否可以删除任何不符合特定代码页规范的字符?
数据库使用的是SQL Server 2012版本。

你真的想要删除不受支持的字符吗?你为什么需要这样做呢? - Tim Schmelter
我无法使用 Nvarchar。 - Itay.B
3个回答

4

您可以尝试将 nvarchar() 列转换为 varchar() 以查找行:

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

2
它真的有效吗?因为当我使用它时,对于中文字符,try_convert返回的不是null而是??。已测试:SELECT try_convert(varchar(max), N'人物') - Tim Schmelter
为什么这个转换会失败?这个答案对我来说没有意义。 - DavidG
@TimSchmelter,也许你当前的代码页面支持中文? - Itay.B

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包含非英文字符,当你尝试将其转换为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

如果Gordon的方法不起作用,因为你从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接