改变列宽


39

增大列(nvarchar)宽度是否一定会使表格掉落?

换句话说,可以在具有活跃用户的生产环境中更改宽度吗?

我发现,如果大小增加(而不是减小),这将不是问题。

Answers:


52

如果通过如下所示的T-SQL语句执行此操作,则不会发生表删除,并且可以在生产环境中安全地执行此操作:

alter table <table> alter column <column> nvarchar(biggernumber) [not] null

如果通过SSMS设计表GUI进行操作,则取决于它决定使用哪种脚本来实施更改。有时,它将数据插入临时表中,删除原始表,创建该表的新版本,然后将其重新插入新表中。一种简单的方法是单击“生成脚本”按钮,然后查看计划执行的T-SQL。


1
我以为“生成脚本”按钮甚至在显示脚本之前都会发出警告,警告您即将删除表。
Nick Chammas

1
它确实引发了错误,但是直到您在带有脚本的窗口上单击“确定”(或运行或执行其他操作)后,它才真正运行脚本。您可以复制脚本并取消显示脚本的窗口。
mrdenny

但是它能说从float到Decimal(n,n)的变化吗?
Nishanth Shaan

如果复制表,这会有什么影响?我假设订户表不会自动更新?
tmwoods

18

增加列的列宽nvarchar不需要删除表。任何ALTER TABLE操作都不会。有关更改表或列属性时的限制的详细信息,可以阅读ALTER TABLE语句

我从以下文档中复制了最相关的部分:

更改列的大小

您可以通过在ALTER COLUMN子句中为列数据类型指定新的大小来更改列的长度,精度或小数位数。如果列中存在数据,则新大小不能小于数据的最大大小。另外,除非列是varchar,nvarchar或varbinary数据类型,并且索引不是PRIMARY KEY约束的结果,否则无法在索引中定义该列。参见示例P。

锁和ALTER TABLE

ALTER TABLE中指定的更改将立即实施。如果更改需要修改表中的行,则ALTER TABLE将更新行。ALTER TABLE在表上获取模式修改锁,以确保更改期间没有其他连接甚至引用该表的元数据,但最后需要非常短的SCH-M锁的联机索引操作除外。在ALTER TABLE…SWITCH操作中,将在源表和目标表上获取锁定。对表所做的修改将被记录并且可以完全恢复。影响很大表中所有行的更改(例如删除列或使用默认值添加NOT NULL列)可能需要很长时间才能完成并生成许多日志记录。这些ALTER TABLE语句应与任何INSERT,UPDATE,


也很好的答案。但是我只能选一个。谢谢!
费尔南多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.