【问题标题】:How to create a constraint on custom datatype in SQL Server如何在 SQL Server 中创建自定义数据类型的约束
【发布时间】:2022-07-13 04:35:27
【问题描述】:

我想在 SQL Server 中创建一个带有某种约束的自定义数据类型,通过运行自定义函数来检查和验证type,如果失败则返回错误。

例如

我在 SQL Server 中有某种希伯来日历,它具有从希伯来日期转换为公历日期的函数,因此我尝试创建一个自定义数据类型,例如:

create type dbo.HebrewDate
from nvarchar(20)

这会按预期工作,但我希望有一个 constraint 之类的:

constraint <constraint_name> check((select <my_convert_function>(HebrewDate)) is not null)

但这不起作用,因为create type 本身不支持约束。

所以我尝试创建一个可以返回表的类型:

create type dbo.HebrewDate
as table(
    HebrewDay nvarchar(4),
    HebrewMonth nvarchar(10),
    HebrewYear nvarchar(6),
    constraint <constraint_name> check((select <my_convert_function>(HebrewDay, HebrewMonth, HebrewYear)) is not null)
)

这会返回以下错误:

在这种情况下不允许子查询。只允许使用标量表达式。

当我删除 select 子句时,它会返回:

关键字“CONSTRAINT”附近的语法不正确。

我在mssqltips.com 中找到了一个可能有效的解决方案,但是当我使用 而不是 时,此解决方案对我不起作用,因为当我右键单击Types 时它只显示刷新。

上述解决方案的另一个问题是,它使用create rule,而在docs.microsoft.com 上它在创建规则上说:

此功能将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。我们建议您改用检查约束。检查约束是使用 CREATE TABLE 或 ALTER TABLE 的 CHECK 关键字创建的。有关详细信息,请参阅唯一约束和检查约束。

有什么建议吗?我想在 sql 中创建它,因为我还不知道如何在 c# 中编程,但如果这是唯一的选择...

我的表和函数在Github

【问题讨论】:

  • 您可以使用 DDL 触发器在添加列希伯来日期时自动生成表检查约束。有点吓人,但确实有效。 (发生了什么,这里有 100 厘米)

标签: azure-data-studio ssms sql sql-server azure-data-studio


【解决方案1】:

您不能对别名类型进行限制,因此它们大多是无用的。

The grammar for CREATE TYPE 为表类型指定列和表CHECK 约束,但不能命名。您也不能使用子查询,但普通的CHECK 约束也不能,我不明白您为什么要这样做。

create type dbo.HebrewDate
as table(
    HebrewDay nvarchar(4),
    HebrewMonth nvarchar(10),
    HebrewYear nvarchar(6),
    check(<my_convert_function>(HebrewDay, HebrewMonth, HebrewYear) is not null)
)

您是否应该在这里使用标量函数完全是一个不同的问题。它们具有严重的性能影响,尤其是在 CHECK 约束中使用时。

更好的选择是返回日期的 SQLCLR 类型,直接从HebrewCalendar 中获取信息,这样可以避免您重新发明轮子。 1
1 קידוש החודש 真的困难

【讨论】:

  • 我接受这个答案并投票,即使我还不知道如何解决我的问题,因为我还不知道 c#,但我知道这是唯一的办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2010-12-22
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 2010-09-09
  • 2011-06-23
相关资源
最近更新 更多