我有一个表,主要用于表示实体之间的关系(即主要由外键组成)。这些关系随时间变化,因此该表具有 StartDate 和 EndDate 列。我现在需要添加开始和结束日期的另一个维度,这意味着可以使用两个不同的日期“镜头”(使用两个日期查询,@Date1 和 @Date2)查看关系,因此架构将如下所示:
MyJoinTable:
| Id | Entity1Id | Entity2Id | StartDate1 | EndDate1 | StartDate2 | EndDate2 |
|----|-----------|-----------|------------|------------|------------|------------|
| 1 | A | B | 1753-01-01 | 2018-09-01 | 1753-01-01 | 2025-01-01 |
| 2 | A | B | 2018-09-01 | 2018-10-01 | 1753-01-01 | 2018-11-01 |
| 3 | A | C | 2018-09-01 | 2018-10-01 | 2018-11-01 | 2025-01-01 |
| 4 | A | B | 2018-10-01 | 2025-01-01 | …Run Code Online (Sandbox Code Playgroud) 我正在尝试提出一个数据库脚本,用于将应用程序数据库的早期版本迁移到更高版本。差异相当大,完成迁移将涉及创建新表、重命名表、添加函数、添加具有依赖于这些函数的计算列的视图等。脚本完成后,我将其交给其他人在目标环境上运行。
我希望能够在单个事务中运行整个迁移,这样如果出现问题,回滚就很容易了。
我遇到的问题是,当脚本尝试时CREATE FUNCTION,它会抱怨:
SQL80001:语法不正确:“CREATE FUNCTION”必须是批处理中的唯一语句。
我做了一些研究,发现 SSMS 允许使用GO关键字来分隔批次,但是每次我尝试将整个脚本包装在 a 中BEGIN TRANSACTION,然后包含 aGO以将 create 函数调用分离到自己的批次中时,我得到一个错误:
“GO”附近的语法不正确。
我不知道为什么,因为像这样的答案似乎适用于那里的 GO 语句。
我还假设(可能是错误的)我提供脚本的人将使用 SSMS。
我还发现了几篇提到 using 的文章,SET XACT_ABORT ON;我一开始就在交易之外尝试过。
所以我的脚本看起来像这样:
SET XACT_ABORT ON
GO
BEGIN TRY
BEGIN TRANSACTION
-- Create some tables
GO -- Error
CREATE FUNCTION [...]
GO -- Error
-- Create some views that rely on the above function
COMMIT TRANSACTION
END TRY -- With the GOs in there, …Run Code Online (Sandbox Code Playgroud)