自动生成的SQL Server脚本在IF语句中不起作用

时间:2015-04-03 19:14:03

标签: sql sql-server sql-server-2008 ssms

使用SQL Server 2008我有一个大型脚本,我发布的项目的每个版本都有一个IF语句...

例如:

IF versionNo < 1.2  
BEGIN
......
END

IF versionNo < 1.3  
BEGIN
......
END

这样我可以针对任何版本运行脚本,它会将数据库一直带到最新版本。将SQL Server自动生成的脚本放在IF语句中时,我开始遇到问题。例如,如果我在其中一个表的中间添加一个新列,我将使用SQL Server Management Studio生成的相当大的脚本并将其添加到我的IF语句中。我假设自动生成的脚本做了这么多,因为我将新列添加到表的中间而不是结束。它创建一个临时表,然后重新创建原始表。

这样做会导致一些问题:

  1. GO语句不能在if语句
  2. 创建的触发器似乎需要GO语句
  3. 我尝试在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
    

0 个答案:

没有答案