如何在 SQL Server 中创建有界范围类型?

Joh*_*ing 3 sql-server range-types user-defined-type

我想创建一个圣经经文表,其中有一个字段代表一系列圣经经文。目前我将此范围表示为一对值(VerseBegId 和 VerseEndId)。我想要类似 Sql Server 空间数据类型的东西

代替

CREATE TABLE BibleVerse AS TABLE
(
    VerseBegId int NOT NULL,
    VerseEndId int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

我想要

CREATE TABLE BibleVerse AS TABLE
(
  VerseRange ??? NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 8

除了 SQLCLR,您还可以将这两个值存储在 XML 或 JSON 中(如果您使用的是 SQL Server 2016 或更高版本)并将它们作为离散值检索。同样,您可以简单地将它们转换VARCHAR并放置在一个列中,用逗号分隔(我根本不推荐这样做,但它在功能上与我刚刚提到的其他方法相似)。SQLCLR 方法可以轻松地将离散值取回并保留其本机数据类型,但您也可以轻松编写一些辅助 UDF 来对那些被推送到 XML 或 JSON 中的值执行相同的操作。

在所有这些情况下,虽然你可以实现在单个列中存储两个值的目标,鉴于每种方法都有一定的开销,但我看不出这样做有什么好处,但使用情况似乎并不合理。创建您自己的类型的主要原因不仅仅是关联相关的数据点,而是能够对它们采取行动。内部 CLR 类型不仅存储离散数据点,而且还提供了很多方法来对这些数据点做一些有趣的事情。我不确定您可以使用没有常用算法来使用它们的开始和结束数字在操作上做什么。似乎您将做更多的工作来恢复这些值(并且这样做很可能会降低性能),而不是将它们放入这样的结构中所获得的收益。

除非您可以清楚地看到这样做有保证的好处,否则我建议您将它们保留为离散数据点。如果我没记错的话,你应该可以使用TINYINT,假设没有诗句 # 超过 255(它们肯定不会是负数或NULL)。看这里(新约统计)和这里(旧约统计 - 新美国圣经)似乎新约(路加福音第 1 章)的最高经文编号是 80,希伯来圣经是 176 - 基督教中的“旧约”术语——(诗篇 119 篇)。

  • @EvanCarroll 我不建议使用 JSON,甚至不建议使用 XML。我只是指出,这些与 SQLCLR 一起是将离散数据点存储在单个值中的选项。但是,更重要的是,考虑到该范围的预期用途,这些方法都没有优势。与存储两个“TINYINT”值相比,它们每个都有额外的开销(在大小和使用复杂性方面)。鉴于圣经经文是信息性的,而不是可操作的,因此没有必要比较它们,或找到交叉点、重叠等。甚至可能不需要索引它们。 (3认同)

Mar*_*ith 6

为此,您需要使用 CLR 用户定义的数据类型。

它与此处的 Point 示例代码非常相似。

但我不推荐它。它内置了对 CLR 的要求,这会降低数据库的可移植性(您将无法将其迁移到 Azure SQL 数据库)。

在使用时更新数据类型也很麻烦,与只有两int列相比,我想不出这样做有什么好处。