我正在尝试使用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脚本,无论是变更集还是更改日志。
答案 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;');