2017-02-21 56 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)) 

與空字符串替換?和更新。

相關問題