2016-03-04 31 views
0

我有一堆SQL語句需要執行以更新數據庫模式 - 它們都單獨運行(即,當我手動運行它們之後其他),但當我嘗試將它們組合成單個腳本時,遇到了一些問題,並且纏繞了一些版本控制邏輯。單獨的T-SQL語句單獨運行良好,但在合併時不運行

我的腳本如下:

DECLARE @VersionCode varchar(20) 
DECLARE @Description varchar(50) 
DECLARE @Author varchar(20) 
DECLARE @AppVersion varchar (10) 

SET @VersionCode = 'version code'; 
SET @Description = 'description'; 
SET @Author = 'author'; 
SET @AppVersion = 'app version'; 

BEGIN 
    IF NOT EXISTS (SELECT * FROM [Version] WHERE [VersionCode] = @VersionCode) 
    BEGIN 
     ALTER TABLE [Journal] ADD [BreakDurationNew] INT NULL 
     UPDATE [Journal] SET BreakDurationNew = BreakDuration 
     ALTER TABLE [Journal] DROP COLUMN [BreakDuration] 
     EXEC sp_rename 'Journal.BreakDurationNew', 'BreakDuration', 'COLUMN'; 

     -- create triggers on JournalBreak so that BreakDuration on Journal is updated 
     CREATE TRIGGER TR_JournalBreak_Insert ON [JournalBreak] 
     FOR INSERT 
     AS 
     BEGIN 
      UPDATE [Journal] SET BreakDuration = (coalesce([dbo].[CalculateJournalBreak]([JournalId]),(0))) WHERE [JournalId] IN (SELECT JournalId FROM INSERTED) 
     END 

     CREATE TRIGGER TR_JournalBreak_Update ON [JournalBreak] 
     FOR UPDATE 
     AS 
     BEGIN 
      UPDATE [Journal] SET BreakDuration = (coalesce([dbo].[CalculateJournalBreak]([JournalId]),(0))) WHERE [JournalId] IN (SELECT JournalId FROM INSERTED) 
      UPDATE [Journal] SET BreakDuration = (coalesce([dbo].[CalculateJournalBreak]([JournalId]),(0))) WHERE [JournalId] IN (SELECT JournalId FROM DELETED) 
     END 

     -- insert version record 
     INSERT INTO [RG].[dbo].[Version] (VersionCode, Description, Author, AppVersion) VALUES 
     (@VersionCode, @Description, @Author, @AppVersion) 
    END 
END 

我的猜測是,我得到的東西(或一堆東西!)語法錯了我的劇本,但我目前還不能發現它。任何人都可以幫忙嗎?

乾杯!

+4

您對T-SQL還沒有「感覺」。例如,CREATE TRIGGER必須是批處理中的第一個命令(或者以「GO」開頭)。因此,除非使用動態SQL,否則不能有條件地創建觸發器。 –

+0

@GordonLinoff太真了!在研究這件事時,我確實看到了有關CREATE TRIGGER的事情 - 即使我刪除了兩個CREATE TRIGGER語句,它也會失敗,並顯示無害的東西... – jpoh

+0

*「失敗,無效的東西......」*>失敗的方式如何? –

回答

2

嘗試像@GordonLinoff評論

DECLARE @VersionCode VARCHAR(20) = 'version code' 
DECLARE @Description VARCHAR(50) = 'description' 
DECLARE @Author VARCHAR(20) = 'author' 
DECLARE @AppVersion VARCHAR(10) = 'app version' 
DECLARE @CMD NVARCHAR(Max) = '' 

BEGIN 
    IF NOT EXISTS (
      SELECT * 
      FROM [Version] 
      WHERE [VersionCode] = @VersionCode 
      ) 
    BEGIN 
     SET @CMD = 'ALTER TABLE [Journal] ADD [BreakDurationNew] INT NULL' 
    EXEC SP_EXECUTESQL @CMD 

    SET @CMD = 'UPDATE [Journal] SET BreakDurationNew = BreakDuration 

    ALTER TABLE [Journal] DROP COLUMN [BreakDuration]' 

    EXEC SP_EXECUTESQL @CMD 

    EXEC sp_rename 'Journal.BreakDurationNew','BreakDuration','COLUMN'; 

    -- create triggers on JournalBreak so that BreakDuration on Journal is updated 
    SET @CMD = ' 
    CREATE TRIGGER TR_JournalBreak_Insert ON [JournalBreak] 
    FOR INSERT 
    AS 
    BEGIN 
     UPDATE [Journal] SET BreakDuration = (coalesce([dbo].[CalculateJournalBreak]([JournalId]),(0))) WHERE [JournalId] IN (SELECT JournalId FROM INSERTED) 
    END' 

    EXEC SP_EXECUTESQL @CMD 

    SET @CMD = ' 
    CREATE TRIGGER TR_JournalBreak_Update ON [JournalBreak] 
    FOR UPDATE 
    AS 
    BEGIN 
     UPDATE [Journal] SET BreakDuration = (coalesce([dbo].[CalculateJournalBreak]([JournalId]),(0))) WHERE [JournalId] IN (SELECT JournalId FROM INSERTED) 
     UPDATE [Journal] SET BreakDuration = (coalesce([dbo].[CalculateJournalBreak]([JournalId]),(0))) WHERE [JournalId] IN (SELECT JournalId FROM DELETED) 
    END 
    ' 

    EXEC SP_EXECUTESQL @CMD 

    -- insert version record 
    INSERT INTO [RG].[dbo].[Version] (VersionCode, Description, Author, AppVersion) VALUES 
    (@VersionCode, @Description, @Author, @AppVersion) 
END 
END 
+0

感謝您的回答。但它仍然不適合我。我得到的錯誤是''UPDATE [Journal] SET BreakDurationNew = BreakDuration'上的無效列名'BreakDurationNew'',這幾乎表明它完全忽略了它之前的行(它添加了新列) - 類似於當我簡單地刪除'CREATE TRIGGER'命令 – jpoh

0

看起來你正試圖創造某種補丁機制。我建議製作單獨的腳本:

  1. 一些腳本,將檢查您有特定的服務器上的版本,並會決定是否運行實際補丁腳本或不

  2. 簡單的「笨」與所有DDL和DML語句(與GO分離器在需要的地方)適用於確定的版本補丁腳本

所以我的建議是建立一個流量控制工具,給它一個功能阻止我的服務器上有哪個版本和另一個功能 - 發送適當的補丁腳本到sqlcmd.exe。如果有的話,可能會檢查錯誤。這可能甚至是一個批處理文件(* .cmd)。

相關問題