如果我将列从 nvarchar(2) 更改为 nvarchar(10) 或将列从 char(2) 更改为 nvarchar(10),会发生什么情况?这会锁定、重新组织表还是不会产生任何影响或停机?
我试图找出如果我更改一列会发生什么,但我什么也没找到。这是一个很大的表,有一两列需要更改。这是关于 MS SQL Server 2008 R2 的。
答案1
找出答案的最简单的方法是使用测试环境创建一个虚拟表和一些虚拟记录,应用所讨论的更改,然后通过分析器跟踪操作。
或者在 SSMS 中设计的表中更改表,然后使用“生成更改脚本”按钮。当我将列从 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
答案2
如果您使用 ALTER 命令,它将创建另一个表,将现有数据复制到新表,完成后删除旧表,然后使用旧表名重命名新表。我认为在实时数据库期间执行此操作不是最佳做法,但有方法可以处理生产数据。
http://www.sqlmag.com/article/tsql3/resizing-a-column-in-a-large-table.aspx
答案3
当表列的数据类型正在修改时,无法执行任何其他操作(如插入更新删除),整个表将被锁定。也不能使用 NOLOCK 进行选择。