我有一堆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
我的猜測是,我得到的東西(或一堆東西!)語法錯了我的劇本,但我目前還不能發現它。任何人都可以幫忙嗎?
乾杯!
您對T-SQL還沒有「感覺」。例如,CREATE TRIGGER必須是批處理中的第一個命令(或者以「GO」開頭)。因此,除非使用動態SQL,否則不能有條件地創建觸發器。 –
@GordonLinoff太真了!在研究這件事時,我確實看到了有關CREATE TRIGGER的事情 - 即使我刪除了兩個CREATE TRIGGER語句,它也會失敗,並顯示無害的東西... – jpoh
*「失敗,無效的東西......」*>失敗的方式如何? –