Sqlserver修改在线表的表字段类型

跟你唠唠我之前改表字段那会儿的事儿。

那年头,我还在一家做电商的公司,数据库都是SQL Server。
有一次,老板说要把一个叫orders的大表里的customer_name字段从nvarchar改成varchar,说这样可以省点存储空间。
我这心里直打鼓啊,这可是个3 6 9 万条数据的表,直接改?我怕。

你说的这个方法,我当年也用过类似的。
就是先建个临时表,结构和原表一样,但把要改的字段改成varchar。
然后搞个脚本,用INSERT INTO ... SELECT CONVERT(varchar(2 5 5 ), customer_name) AS customer_name FROM orders这种语句,把数据一条条搬过去。
搬的时候加了锁,WITH (HOLDLOCK TABLOCKX),就是怕别人在改数据。
搬完之后,把原表删了,用sp_rename把临时表重命名为orders,然后重建索引。

那一次,我选在半夜三更改的,表锁了大概1 4 分3 2 秒。
虽然我加了锁,但还是有些小线程访问不了,客户那边有点反应。
所以啊,这种操作,一定要在业务低峰期干,不然真影响生意。

后来我琢磨,这事儿能不能优化一下?就试了分批处理,比如按订单ID的范围一批一批搬,这样每次锁的时间就短了。
还有,我发现SQL Server 2 01 6 以后,有些版本支持直接用ALTER TABLE ... ALTER COLUMN来改字段类型,好像是更快。
不过这得先在测试环境里试一试,看看行不行。

还有个坑,就是你没提到,但我也踩过。
就是如果varchar的长度比原来的nvarchar短,那数据就容易被截断。
所以改之前,一定要看好原来的长度,新长度得能装下原来的数据。
还有,改完字段类型,索引也得重新建,不然查询还是慢。

总的来说,你说的这个方法挺稳妥,就是慢。
现在新版本SQL Server有更好的方法,可以试试直接改,但一定要先测试。
搞这种数据库操作,最怕的就是没测试就上生产,那麻烦就大了。

sqlserver 修改表的字段数据类型

上周,我那个朋友在SQLServer里头碰到了个难题。
他想把一个表里的字段数据类型从VARCHAR改成INT,可这中间的转换并不简单。
首先,得确保数据兼容,否则直接改会出大问题。

比如,他表里的字段a本来是VARCHAR,现在想改成INT。
但是,字段a里有NULL值,还有几个不是数字的字符。
这就得先动手处理这些不兼容的数据。

处理NULL值,他用了UPDATE语句,把NULL值都替换成了'0'。
SQL语句是:UPDATE 表 SET 字段a='0' WHERE 字段a IS NULL; 这里得注意,字段a原来要是VARCHAR类型,替换成'0'是为了后面转换成INT时,'0'能正确地变成整数0。

非数字字符的处理,他得用更复杂的逻辑,比如CASE语句,或者别的什么方法,具体得看数据的复杂程度和需求。

处理好这些之后,才能放心地修改字段的数据类型。
他用ALTERTABLE语句来改,比如:ALTER TABLE 表 ALTER COLUMN 字段a INT;
总之,修改字段数据类型之前,一定要把数据兼容的问题解决了。
先用UPDATE处理数据,再用ALTERTABLE改字段类型。
这事儿得细心,一步错,可能就得重来。
你看着办吧。