調整列大小是否會鎖定表?

調整列大小是否會鎖定表?

如果我將列從 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 選。

相關內容