如何检查SQL Server 2016中NVARCHAR列能否转换为VARCHAR列
检测SQL Server中NVARCHAR(MAX)转VARCHAR(MAX)无效数据的方法
核心原理:当NVARCHAR列中存在当前数据库排序规则对应代码页不支持的Unicode字符时,转换就会失败或出现乱码,可通过以下方法提前验证,无需直接执行ALTER语句:
方法1:全量扫描定位异常行(可直接定位问题数据,推荐)
TRY_CAST为SQL Server 2012及以上版本原生支持,2016可直接使用,转换失败时返回NULL而非抛出错误,不会影响线上业务运行:
SELECT 你的表主键列, ExtendedMessage FROM [tablename] WHERE -- 筛选完全无法转换的行 TRY_CAST(ExtendedMessage AS VARCHAR(MAX)) IS NULL -- 追加以下条件可同时筛选转换后会出现乱码/字符丢失的行 OR TRY_CAST(ExtendedMessage AS VARCHAR(MAX)) <> ExtendedMessage
如果查询无返回结果,说明所有数据都可正常完成转换。
方法2:抽样验证(适合超大表快速初步判断风险)
你的表单量达7.3亿行,全量扫描IO开销较高,可先抽样验证初步判断转换风险:
-- 随机抽取10万行验证,无异常再逐步扩大扫描范围 SELECT TOP 100000 你的表主键列, ExtendedMessage FROM [tablename] WHERE TRY_CAST(ExtendedMessage AS VARCHAR(MAX)) IS NULL OR TRY_CAST(ExtendedMessage AS VARCHAR(MAX)) <> ExtendedMessage
额外注意事项
- 全量扫描建议在业务低峰期执行,使用快照隔离级别读取数据,避免锁表影响正常写入
- 转换前务必做好全量数据备份,避免不可逆的数据丢失
- 即使确认无异常数据,执行ALTER语句时也会锁表较长时间,建议通过分区切换、在线表重构等方式完成修改,减少业务停机时间
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

