我正在尝试在SQL的表的末尾中添加一列,如下所示:
由于某种原因,当我的同事这样做时,它会生成通常的ALTER TABLE
脚本。
当我尝试这样做时,它将生成一个脚本,该脚本创建一个临时表,然后删除现有表,然后用temp表替换原始表,如下所示:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Table_Name
DROP CONSTRAINT DF_Table_Name_NewColumnName
GO
CREATE TABLE dbo.Tmp_Table_Name
(
Id int NOT NULL IDENTITY (1, 1),
Column1 varchar(16) NOT NULL,
NewColumnName int NOT NULL,
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Table_Name SET (LOCK_ESCALATION = TABLE)
GO
ALTER TABLE dbo.Tmp_Table_Name ADD CONSTRAINT
DF_Table_Name_NewColumnName DEFAULT ((1)) FOR NewColumnName
GO
SET IDENTITY_INSERT dbo.Tmp_Table_Name ON
GO
IF EXISTS(SELECT * FROM dbo.Table_Name)
EXEC('INSERT INTO dbo.Tmp_Table_Name (Id, Column1, NewColumnName)
SELECT Id, Column1, NewColumnName FROM dbo.Table_Name WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Table_Name OFF
GO
DROP TABLE dbo.Table_Name
GO
EXECUTE sp_rename N'dbo.Tmp_Table_Name', N'Table_Name', 'OBJECT'
GO
ALTER TABLE dbo.Table_Name ADD CONSTRAINT
PK_Table_Name PRIMARY KEY CLUSTERED
(
Id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
我可以理解为什么如果我要删除列或在表的中间添加列,为什么可以这样做,但是我不是,我只是在表的末尾添加一列。
>此问题实际上导致SQL Server删除表中的所有数据,如果设计有任何问题(我最初是通过忘记向默认列中添加默认值来捕获此错误的,所以它擦除了表中的所有数据..谢天谢地,只有在开发环境中。
答案 0 :(得分:1)
不确定SQL Server为什么这样做。 这些链接可以提供有关在SQL Server中更改表的一些信息