2017-04-02 109 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