如何在 SQL 服务器中对自定义数据类型创建约束
How to create a constraint on custom datatype in SQL Server
我想在 SQL 服务器中创建一个自定义数据类型,它带有某种约束,通过自定义函数 运行 和 return 检查和验证 type
如果失败,则为错误。
例如
我在 SQL 服务器中有某种希伯来日历,具有将希伯来日期转换为公历日期的功能,因此我尝试创建一个自定义数据类型,例如:
create type dbo.HebrewDate
from nvarchar(20)
这会按预期工作,但我想要 constraint
如:
constraint <constraint_name> check((select <my_convert_function>(HebrewDate)) is not null)
但这行不通,因为 create type
本身不支持约束。
所以我尝试创建一个 return 类型 table:
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)
)
这 return 是以下错误:
Subqueries are not allowed in this context. Only scalar expressions are allowed.
当我删除 select
子句时 returns:
Incorrect syntax near the keyword 'CONSTRAINT'.
我在 mssqltips.com that might work, but as I use azure-data-studio and not ssms 中找到了一个解决方案,这个解决方案对我不起作用,因为当我右键单击 Types
时,它只显示 刷新。
上述解决方案的另一个问题是,他正在使用 create rule
,而在 docs.microsoft.com 上,它在创建规则时说:
This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. We recommend that you use check constraints instead. Check constraints are created by using the CHECK keyword of CREATE TABLE or ALTER TABLE. For more information, see Unique Constraints and Check Constraints.
有什么建议吗?我想在 sql 中创建它,因为我还不知道如何在 C# 中编程,但如果这是唯一的选择...
我的 table 和函数在 Github
您不能对别名类型进行限制,因此它们大多无用。
The grammar for CREATE TYPE
为table类型指定列和tableCHECK
约束,但不能命名。您也不能使用子查询,但正常的 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
约束中使用时。
更好的选择 是 returns 日期的 SQLCLR 类型,直接从 HebrewCalendar
, which avoids you having to reinvent the wheel. 1
中获取信息
1 קידוש החודש 是 真的 困难
我想在 SQL 服务器中创建一个自定义数据类型,它带有某种约束,通过自定义函数 运行 和 return 检查和验证 type
如果失败,则为错误。
例如
我在 SQL 服务器中有某种希伯来日历,具有将希伯来日期转换为公历日期的功能,因此我尝试创建一个自定义数据类型,例如:
create type dbo.HebrewDate
from nvarchar(20)
这会按预期工作,但我想要 constraint
如:
constraint <constraint_name> check((select <my_convert_function>(HebrewDate)) is not null)
但这行不通,因为 create type
本身不支持约束。
所以我尝试创建一个 return 类型 table:
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)
)
这 return 是以下错误:
Subqueries are not allowed in this context. Only scalar expressions are allowed.
当我删除 select
子句时 returns:
Incorrect syntax near the keyword 'CONSTRAINT'.
我在 mssqltips.com that might work, but as I use azure-data-studio and not ssms 中找到了一个解决方案,这个解决方案对我不起作用,因为当我右键单击 Types
时,它只显示 刷新。
上述解决方案的另一个问题是,他正在使用 create rule
,而在 docs.microsoft.com 上,它在创建规则时说:
This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. We recommend that you use check constraints instead. Check constraints are created by using the CHECK keyword of CREATE TABLE or ALTER TABLE. For more information, see Unique Constraints and Check Constraints.
有什么建议吗?我想在 sql 中创建它,因为我还不知道如何在 C# 中编程,但如果这是唯一的选择...
我的 table 和函数在 Github
您不能对别名类型进行限制,因此它们大多无用。
The grammar for CREATE TYPE
为table类型指定列和tableCHECK
约束,但不能命名。您也不能使用子查询,但正常的 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
约束中使用时。
更好的选择 是 returns 日期的 SQLCLR 类型,直接从 HebrewCalendar
, which avoids you having to reinvent the wheel. 1
中获取信息
1 קידוש החודש 是 真的 困难