2017-04-02 64 views
0

我试图用liquibase成员添加到角色,但SQL是从SQL Server 2008至2012年运行不同liquibase脚本

SQL Server 2008中的不同:

exec sp_addrolemember db_datareader, MYUSER 

的SQL Server 2012:

ALTER ROLE db_datawriter ADD MEMBER MYUSER 

当通过对SQL Server运行liquibase 2012和工作正常,但是当对SQL Server 2008运行失败和下面的SQL说:

关键字附近

语法不正确 '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

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

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

这工作,但我希望我不会有相同的逻辑在我加入的成员到角色的每个变更获得的版本。 – Aaron