小编Sea*_*ish的帖子

索引多个生效日期列的最佳方法

我有一个表,主要用于表示实体之间的关系(即主要由外键组成)。这些关系随时间变化,因此该表具有 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)

index sql-server t-sql index-tuning sql-server-2016

5
推荐指数
1
解决办法
659
查看次数

SQL Server 迁移脚本中的多个批处理

我正在尝试提出一个数据库脚本,用于将应用程序数据库的早期版本迁移到更高版本。差异相当大,完成迁移将涉及创建新表、重命名表、添加函数、添加具有依赖于这些函数的计算列的视图等。脚本完成后,我将其交给其他人在目标环境上运行。

我希望能够在单个事务中运行整个迁移,这样如果出现问题,回滚就很容易了。

我遇到的问题是,当脚本尝试时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)

sql-server ssms sql-server-2016

3
推荐指数
1
解决办法
1471
查看次数

标签 统计

sql-server ×2

sql-server-2016 ×2

index ×1

index-tuning ×1

ssms ×1

t-sql ×1