sql基础 把有数据列字符nvarchar变为int

摘要:将HostID列从nvarchar(100)转为int需要三个步骤:1)数据校验,检查非数字字符、超出int范围(-2147483648到2147483647)及空字符串;2)数据清理,将空字符串转为NULL,删除无效数据;3)执行ALTER TABLE修改列类型为int NULL。大表转换需考虑性能影响,建议在业务低峰期执行。转换前需确保所有数据都能安全转换,否则会报错。完成后续验证列结构是否正确。

表已经创建 有数据 是数字 需要把[HostID] [nvarchar](100) NULL, 变为int

要将 HostID 列从 nvarchar(100) 改为 int,需确保列中所有数据都能安全转换为整数(无非数字字符、不超出 int 范围),否则会报错。以下是分步执行的 SQL 脚本,包含数据校验和转换逻辑:

第一步:数据校验(关键!避免转换失败)

先检查 HostID 中是否存在无法转换为 int 的数据,执行以下查询:

sql

-- 1. 检查非数字字符(排除空值)
SELECT DISTINCT HostID 
FROM dbo.UAT_PatronList_Registration_Tracking
WHERE HostID IS NOT NULL 
  AND HostID NOT LIKE '%[^0-9]%'; -- 匹配包含非数字的记录

-- 2. 检查超出 int 范围的值(SQL Server int 范围:-2147483648 到 2147483647)
SELECT DISTINCT HostID 
FROM dbo.UAT_PatronList_Registration_Tracking
WHERE HostID IS NOT NULL 
  AND (TRY_CAST(HostID AS BIGINT) < -2147483648 
       OR TRY_CAST(HostID AS BIGINT) > 2147483647);

-- 3. 检查空字符串('' 无法直接转换为 int,需处理为 NULL)
SELECT HostID 
FROM dbo.UAT_PatronList_Registration_Tracking
WHERE HostID = '';

第二步:处理非法数据(根据校验结果执行)

如果上述查询返回结果,需先清理数据:

sql

-- 情况1:空字符串转为 NULL(int 列允许 NULL)
UPDATE dbo.UAT_PatronList_Registration_Tracking
SET HostID = NULL
WHERE HostID = '';

-- 情况2:删除非数字/超出范围的无效数据(或根据业务逻辑修正)
DELETE FROM dbo.UAT_PatronList_Registration_Tracking
WHERE HostID IS NOT NULL 
  AND (HostID LIKE '%[^0-9]%' -- 非数字
       OR TRY_CAST(HostID AS BIGINT) < -2147483648 
       OR TRY_CAST(HostID AS BIGINT) > 2147483647); -- 超出 int 范围

第三步:修改列数据类型

确认所有数据合法后,执行 ALTER TABLE 修改列类型:

sql

-- 修改 HostID 从 nvarchar(100) 为 int(允许 NULL)
ALTER TABLE dbo.UAT_PatronList_Registration_Tracking
ALTER COLUMN HostID INT NULL;

补充说明

  1. 如果 HostID 有默认值 / 约束:若该列存在默认值、外键约束等,需先删除约束再修改类型,修改后可重新创建。
  2. 大表性能注意:若表中数据量极大(百万级以上),修改列类型可能会锁表,建议在业务低峰期执行。
  3. 验证结果:修改后可执行以下查询确认:

    sql

    -- 查看列结构
    SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'UAT_PatronList_Registration_Tracking' 
      AND COLUMN_NAME = 'HostID';
    
    -- 抽样验证数据类型
    SELECT TOP 10 HostID, SQL_VARIANT_PROPERTY(HostID, 'BaseType') AS Data_Type
    FROM dbo.UAT_PatronList_Registration_Tracking;
    

按以上步骤执行,即可安全完成 HostID 列的数据类型转换。如果校验时发现大量非法数据,建议先确认业务逻辑(是否需要保留该部分数据),再进行处理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云草桑

打赏的过十送音娱有声乐队谱账号

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值