【发布时间】: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 中找到了一个可能有效的解决方案,但是当我使用azure-data-studio 而不是ssms 时,此解决方案对我不起作用,因为当我右键单击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