将多个TSQL更改脚本与跳过相结合

将多个TSQL更改脚本与跳过相结合,tsql,Tsql,我有一堆TSQL更改脚本,它们都按顺序正确命名 我想把这些结合成一个大剧本,再加上一些曲折。我在脚本中包含一个版本号函数,为每个脚本更新该函数,以便在运行change1时返回1,在运行change2时返回2,依此类推。此函数保留在数据库中,并始终返回架构/数据库的版本 我想用几行代码来包装每个更改脚本,以防止已经运行的脚本再次运行,同样,它应该防止更改脚本在太“低”的模式版本上运行。这允许我将所有更改脚本组合成一个,并且在所有更改脚本运行时只应用缺少的更改脚本 这一切都很好,但我无法找到让osq

我有一堆TSQL更改脚本,它们都按顺序正确命名

我想把这些结合成一个大剧本,再加上一些曲折。我在脚本中包含一个版本号函数,为每个脚本更新该函数,以便在运行change1时返回1,在运行change2时返回2,依此类推。此函数保留在数据库中,并始终返回架构/数据库的版本

我想用几行代码来包装每个更改脚本,以防止已经运行的脚本再次运行,同样,它应该防止更改脚本在太“低”的模式版本上运行。这允许我将所有更改脚本组合成一个,并且在所有更改脚本运行时只应用缺少的更改脚本

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

  • GOTO无法跨批工作(脚本包含“GO”)
  • 如果开始结束也不会因为去而起作用
更新:重申一下,我不需要帮助记住当前版本号,我需要一种跳过脚本部分的方法,以防止已应用的更新重新应用

我尝试了很多方法:

  • 我可以用
    db\u executeSql
    语句或
    EXECUTE
    来包装批处理,但这会导致范围界定问题
  • 我可以用IF
    dbo.DB\u VERSION()包装每个批=所需的\u版本,然后开始。。。。结束
    construct,但这很混乱,并且使处理错误变得困难
遇到不应应用变更的情况是意料之中的,并非例外情况。因此,简单地
RETURN
ing当不适用时是不合适的


还有其他建议吗?

您可以将版本号保留在表中,并使用该功能检查表中的值,并在if语句中与您希望进行的更改的版本进行比较。

您好,感谢您抽出时间,但我的问题是没有保留版本号。用户定义的函数可以很好地处理这个问题,而不需要表的开销。我需要的是,一旦确定已经应用了更改,就可以跳过TSQL脚本的各个部分。特别是一种跳过批(由GO语句删除)的方法,因为GOTOs和IF BEGIN END构造只适用于一个批。