我有一个包含两列的表,一列是Varchar
,另一列是NVarchar
。
我想更新所有行,因此VarcharField = NVarcharField。
它不会让我,因为有些行包含varchar
列中不允许使用当前代码页的字符。
如何找到这些行?
是否可以删除任何不符合我使用的特定代码页的字符?
SQL Server 2012。
答案 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
时,非英语字符会变为????
。因此col1
和col2
不相等。
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