【发布时间】:2016-03-15 11:32:15
【问题描述】:
我有一堆要执行的 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 语句,它也会因为一些无害的东西而失败......
-
“它因一些无害的东西而失败......” > 失败的原因是什么?
-
@TT。回复晚了非常抱歉。我得到的错误是
'Invalid column name 'BreakDurationNew'在UPDATE [Journal] SET BreakDurationNew = BreakDuration行上,这几乎表明它完全忽略了它之前的行(在其中添加了新列) -
将其全部包装在单独的动态 SQL 语句中。
标签: sql-server tsql