我想在 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它時只顯示Refresh。
上述解決方案的另一個問題是,他正在使用create rule,而在docs.microsoft.com上它在創建規則上說:
此功能將在 Microsoft SQL Server 的未來版本中洗掉。避免在新的開發作業中使用此功能,并計劃修改當前使用此功能的應用程式。我們建議您改用檢查約束。檢查約束是使用 CREATE TABLE 或 ALTER TABLE 的 CHECK 關鍵字創建的。有關詳細資訊,請參閱唯一約束和檢查約束。
有什么建議么?我想在 sql 中創建它,因為我還不知道如何在 c# 中編程,但如果這是唯一的選擇......
我的表和函式在Github
uj5u.com熱心網友回復:
您不能對別名型別進行限制,因此它們大多是無用的。
語法為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 ????? ?????真的很難
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477204.html
上一篇:從另一個表中的列更新列部分匹配
