如果将一列从nvarchar(2)更改为nvarchar(10)或从char(2)更改为nvarchar(10),会发生什么情况。 这是否locking,重新整理表格还是在没有任何影响或停机的情况下完成这项工作?
我试图find如果我改变一个列会发生什么,但我没有find任何东西。 它是一个有一列或两列的大桌子可以更换。 它关于一个MS SQL Server 2008 R2。
要找出最简单的方法是使用testing环境创build一个虚拟表,一些虚拟logging应用更改的谈话,然后通过分析器跟踪行动。
或更改SSMS中devise的表中的表格,然后使用“生成更改脚本”button。 当我将我的列从Char(2)更改为NVARCHAR(10)。 生成更改脚本产生以下内容:
CREATE TABLE dbo.Tmp_t2 ( id int NULL, c1 nvarchar(50) NULL, c2 nvarchar(2) NULL ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_t2 SET (LOCK_ESCALATION = TABLE) GO IF EXISTS(SELECT * FROM dbo.t2) EXEC('INSERT INTO dbo.Tmp_t2 (id, c1, c2) SELECT id, CONVERT(nvarchar(50), c1), c2 FROM dbo.t2 WITH (HOLDLOCK TABLOCKX)') GO DROP TABLE dbo.t2 GO EXECUTE sp_rename N'dbo.Tmp_t2', N't2', 'OBJECT' GO COMMIT
如果您使用的是ALTER命令,那么它将创build另一个表,将现有数据复制到新表,在完成时删除旧表,然后使用旧表名重新命名新表。 我不认为在实时数据库中这是最好的做法,但有办法处理生产数据。
http://www.sqlmag.com/article/tsql3/resizing-a-column-in-a-large-table.aspx
当表列的数据types正在修改时,没有其他操作(如插入更新删除)可以完成,整个表将被locking。 也不能用NOLOCKselect。