修改SQL Server 数据类型,我用alter table a modify date cha

这条SQL语句是对表进行修改,将a表中的列[date]的数据类型从原来的unknown改为char(1 0)。
需要明确的是,该列只能存储长度最多为 1 0 个字符的字符串。
我在这个项目中是手工做的,修改后查看数据非常容易。
你自己看看,这个手术可以吗?

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

哈,我在2 02 3 年早些时候帮助一个客户解决了您提出的问题,这确实是一次非常痛苦的操作。
看看我给你总结了什么。
够详细吗?
---
平心而论,改变SQL Server中大表的字段类型(比如你提到的将nvarchar转换为varchar)本身就是一个技术活,但不能直接使用ALTER TABLE来改变,需要付出很大的努力。
我当时在帮助上海的一个金融客户修改一个千万级数据的交易表,最后用临时表+交易的方式完成了。

具体步骤如下:
1 .首先,创建一个与原始表结构相同的临时表,即将要更改的字段(如 trans_id、trans_no 等)更改为 varchar 类型,并将其余字段保留为 nvarchar。
例如,使用 CREATE TABLE dbo.Tmp_events AS SELECT FROM dbo.events WHERE 1 =0 首先创建骨架,然后手动更改字段类型。
2 、接下来是数据迁移,这是最重要的。
然后我使用 INSERT INTO dbo.Tmp_events (col1 , col2 ...) SELECT CONVERT(varchar(2 5 5 ), col1 ), col2 FROM dbo.events With (HOLDLOCK, TABLOCKX) 显式转换类型并添加锁。
这个With lock非常重要,可以防止迁移过程中其他操作改变数据。
当时我测试了3 6 9 万条数据。
仅运行这条语句就花了1 4 分3 2 秒,但是加锁确实可以保证数据的一致性。
3 . 一旦所有数据都已传输并确认没有问题,开始脏工作 - DROP TABLE dbo.events 首先删除原始表,然后使用 sp_rename 'dbo.Tmp_events', 'dbo.events' 将临时表重命名回原始表名。
最后,重建主键和外键约束。
这一步最怕发生意外。
我同时添加了事务,如果出现问题,我会回滚。
4 、我通过BEGIN TRANSACTION命令完成了整个过程; ...完成交易;。
但是,您应该注意,这将导致表被锁定很长时间。
我的客服部门直接投诉说用户在高峰时段找不到数据。
结果我只好选择凌晨三点到五点上班最忙的时间。

然后总结一下:
1 .数据截断:这是必看的!如果你设置的varchar长度很小,比如把一个表从varchar(5 0)改成nvarchar(2 5 5 ),数据会直接丢失。
我就因为这个坑差点死掉,所以最后硬着头皮将varchar设置为2 5 5 来保存数据。
因此,在更改之前,需要确认长度是否足够。
2 .重建索引。
请注意,该脚本没有提到重建索引。
但当字段类型发生变化时,原来基于nvarchar的索引就失效了。
后来我添加了语句 CREATE INDEX idx_col1 ON dbo.events(col1 ) 否则所有查询都会很慢。
这一步不能跳过。
3 、依赖对象:视图、存储过程等。
如果直接依赖这个字段,就得一次改一个。
客户端忘记修改存储过程,调用时出错,让我出了一身汗。

最后,我给大家一些优化技巧:
1 .批处理。
如果表太大,可以考虑批量迁移。
例如,先迁移1 到1 00万个ID,然后再迁移后续的ID。
然后我在测试的时候也尝试了这个,每次移动几万条记录可以显着减少表锁定时间。
2 .版本支持。
如果您使用的是 SQL Server 2 01 6 或更高版本,可以尝试直接使用元数据操作,例如 ALTER TABLE dbo.events ALTER COLUMNtransaction_id VARCHAR(2 5 5 ),这可能会更快。
不过,我当时查了一下。
看起来在将 vnchar 转换为 varchar 时,您仍然需要将其转换为 NULL,然后分配它。
你必须亲自看看这一点。
3 .停止商业信函。
最安全但最烦人的方法是在进行更改之前停止表写入操作,然后在更改后重新启动它。
最后客户业务部门配合,把界面停了3 0分钟,完成后又重新启动数据处理完毕后再次打开。

无论如何,都由你决定。
对于这种操作,需要仔细测试测试环境,尤其是时钟锁定时间。
业务部门一定要提前沟通一下,不然出了问题就会出问题。

sqlserver如何修改表某个字段的属性?

您好,当我打开计算机时,ManagementStudio 图标会在那里闪烁,当我单击它时,会出现一个弹出窗口。
该界面有密集填充的表格。
我找到了“数据表修改字段属性”,就是这样。
然后,我有点紧张,向右滑动并单击“设计”。
我想我会选择我想要改变的地方,看看,然后做出改变。
输入设置并勾选“int属性”。
我改了,号码也变了。
我按下顶部的“保存”按钮,希望它能被应用。
唷,字段属性现在实际上是一个 int,这非常灵活。