在 SQL Server 2000 伺服器上,使用 SQL Server 2005 管理工具(Enterprise Manager)修改資料表結構(如在欄位中間插入新欄位)時,工具到底執行了哪些 T-SQL 指令?本文透過 SQL Profiler 追蹤,完整還原其內部操作流程。
test(a nchar(10), b nchar(10))test(a nchar(10), c nchar(10), b nchar(10)) —— 在 a 與 b 之間插入欄位 cSET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
CREATE TABLE dbo.test (
a nchar(10) NULL,
b nchar(10) NULL
) ON [PRIMARY];
COMMIT TRANSACTION;
-- 以 sp_executesql 參數化插入三筆資料
EXEC sp_executesql N'INSERT INTO test(a, b) VALUES (@a, @b)',
N'@a nvarchar(2), @b nvarchar(2)', @a = N'a1', @b = N'b1';
-- ... 重複 a2/b2, a3/b3
Enterprise Manager 採用 建立臨時表 → 複製資料 → 刪除舊表 → 重新命名 的經典模式:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
-- 3.1 建立目標結構的臨時表
CREATE TABLE dbo.Tmp_test (
a nchar(10) NULL,
c nchar(10) NULL, -- 新欄位插在中間
b nchar(10) NULL
) ON [PRIMARY];
-- 3.2 複製現有資料(僅複製共同欄位 a, b)
IF EXISTS (SELECT * FROM dbo.test)
EXEC('INSERT INTO dbo.Tmp_test (a, b) SELECT a, b FROM dbo.test WITH (HOLDLOCK TABLOCKX)');
-- 3.3 刪除原表
DROP TABLE dbo.test;
-- 3.4 將臨時表重新命名為目標表名
EXECUTE sp_rename N'dbo.Tmp_test', N'test', 'OBJECT';
COMMIT TRANSACTION;
SET IDENTITY_INSERT ON,複製完成後再 OFF。ALTER TABLE ... ADD COLUMN ... ONLINE,部分場景可避免鎖表,但中間插入欄位仍需重建表。透過 Profiler 觀察工具內部行為,不僅能排查異常,更能深入理解資料庫引擎對 DDL 的實作策略,是資料庫工程師必備的診斷技能。