【问题标题】:Combining multiple TSQL change scripts with skipping将多个 TSQL 更改脚本与跳过相结合
【发布时间】:2012-05-04 21:23:33
【问题描述】:

我有一堆 TSQL 更改脚本,都按顺序适当命名。

我想将它们组合成一个带有一些曲折的大脚本。我在我为每个脚本更新的脚本中包含一个版本号函数,这样一旦运行更改 1,它就会返回 1,一旦运行 2,它就会返回 2,依此类推。此函数保留在数据库中,并始终返回架构/数据库的版本。

我想用几行包装每个更改脚本,以防止已经运行的脚本再次运行,同样它应该防止更改脚本在太“低”的架构版本上运行。这使我可以将所有更改脚本集中到一个中,并且当它全部运行时,只会应用缺少的更改脚本。

这一切都很好,但是我找不到让 osql / Query Analyzer / Sql Server Studio 跳过已经运行的部分的方法。

  • GOTO 不能跨批次工作(脚本包含“GO”)
  • IF BEGIN END 由于 GO 而无法正常工作

更新:重申一下,我不需要帮助记住当前版本号,我需要一种方法来跳过部分脚本以防止重新应用已应用的更新。

我尝试了很多方法:

  • 我可以将批处理包装在 db_executeSql 语句或 EXECUTE 中,但这会导致范围界定问题。
  • 我可以将每个批次包装在一个 IF dbo.DB_VERSION()!=REQUIRED_VERSION THEN BEGIN .... END 构造中,但这很麻烦,并且难以处理错误。

遇到不应应用更改的情况是意料之中的,这不是例外情况。所以在不适用的时候简单地RETURNing 是不行的。

还有其他建议吗?

【问题讨论】:

    标签: tsql


    【解决方案1】:

    如果是表,您可以保留版本号,并使用该函数检查表中的值并在 IF 语句中与您希望进行的更改的版本进行比较。

    【讨论】:

    • 您好,感谢您抽出宝贵时间,但我的问题是没有检查版本号。用户定义的函数可以很好地处理这一点,而不会产生表的开销。一旦我确定已经应用了更改,我需要的是一种跳过 TSQL 脚本部分的方法。特别是一种跳过批次的方法(由 GO 语句分隔),因为 GOTO 和 IF BEGIN END 构造仅适用于一个批次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2019-08-13
    • 2020-06-11
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多