根据SQL Server版本运行不同的liquibase脚本

时间:2017-04-02 22:03:37

标签: sql-server liquibase

我正在尝试使用liquibase将成员添加到角色,但SQL与SQL Server 2008到2012不同。

SQL Server 2008:

exec sp_addrolemember db_datareader, MYUSER 

SQL Server 2012:

ALTER ROLE db_datawriter ADD MEMBER MYUSER

通过liquibase对SQL Server 2012运行时,以下SQL正常运行,但是当针对SQL Server 2008运行时,它失败并说:

  

关键字' ADD'

附近的语法不正确

代码:

DECLARE @ver nvarchar(50),
        @intVer int,
        @ver2008 int = 10

SET @ver = CAST(serverproperty('ProductVersion') AS nvarchar)
SET @intVer = CAST(SUBSTRING(@ver, 1, CHARINDEX('.', @ver) - 1) AS int)

IF (@intVer = @ver2008)
    exec sp_addrolemember db_datawriter, MYUSER
ELSE
    ALTER ROLE db_datawriter ADD MEMBER MYUSER;

我尝试将版本分开,将SQL Server 2008放在一个文件中,将2012放在另一个文件中并使用'前提条件'在更改日志的顶部(在变更集之外)。但是只有2个OnFail选项,HALT,它会停止整个更新,或者WARN,它只会继续执行脚本,这两个选项都不能满足我的需求。

我需要能够让脚本找出它正在使用的SQL Server版本,并且只运行该特定的liquibase脚本,无论是变更集还是更改日志。

1 个答案:

答案 0 :(得分:1)

如果语法无法识别,整个批处理的编译将失败。您可以通过将语句包装在EXECUTE中或使用sp_executesql来解决此问题。

IF (@intVer = @ver2008)
    EXECUTE(N'exec sp_addrolemember db_datawriter, MYUSER;')
ELSE
    EXECUTE(N'ALTER ROLE db_datawriter ADD MEMBER MYUSER;');