使用SQL Server 2008我有一个大型脚本,我发布的项目的每个版本都有一个IF语句...
例如:
IF versionNo < 1.2
BEGIN
......
END
IF versionNo < 1.3
BEGIN
......
END
这样我可以针对任何版本运行脚本,它会将数据库一直带到最新版本。将SQL Server自动生成的脚本放在IF语句中时,我开始遇到问题。例如,如果我在其中一个表的中间添加一个新列,我将使用SQL Server Management Studio生成的相当大的脚本并将其添加到我的IF语句中。我假设自动生成的脚本做了这么多,因为我将新列添加到表的中间而不是结束。它创建一个临时表,然后重新创建原始表。
这样做会导致一些问题:
GO
语句不能在if语句GO
语句我尝试在EXEC('')
中包装脚本的某些部分,但我的表更改没有得到提交。
以下是根据每个人告诉我的事情修改后的其中一个脚本的示例:
IF @version < 1.3
BEGIN
BEGIN TRANSACTION
sp_executesql
N'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
sp_executesql
N'CREATE TABLE dbo.Tmp_Customer
(
Id int NOT NULL IDENTITY (1, 1),
Name varchar(200) NULL,
Phone varchar(25) NULL,
Fax varchar(25) NULL,
Email varchar(100) NULL,
AddressId int NULL,
Website varchar(50) NULL
) ON [PRIMARY]'
--GO
sp_executesql
N'ALTER TABLE dbo.Tmp_Customer SET (LOCK_ESCALATION = TABLE)'
--GO
sp_executesql
N'SET IDENTITY_INSERT dbo.Tmp_Customer ON'
--GO
sp_executesql
N'IF EXISTS(SELECT * FROM dbo.Customer)
EXEC(''INSERT INTO dbo.Tmp_Customer (Id, Name, Phone, Fax, Email, Website)
SELECT Id, Name, Phone, Fax, Email, Website FROM dbo.Customer WITH (HOLDLOCK TABLOCKX)'')'
--GO
sp_executesql
N'SET IDENTITY_INSERT dbo.Tmp_Customer OFF'
--GO
sp_executesql
N'DROP TABLE dbo.Customer'
--GO
sp_executesql
N'EXECUTE sp_rename N''dbo.Tmp_Customer'', N''Customer'', ''OBJECT'''
--GO
sp_executesql
N'ALTER TABLE dbo.Customer ADD CONSTRAINT
PK_Customer PRIMARY KEY CLUSTERED
(
Id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
--GO
COMMIT
END