Sql-Server-2012
具有檢查約束的使用者定義表類型
我有一個使用者定義的表類型,我想確保某個列在給定範圍內。然而,這個範圍在另一個表中定義。所以我想我可以在這個列上使用一個帶有標量值函式的檢查約束。
CREATE TYPE [dbo].[Accounts] AS TABLE( [AccountName] [varchar](25) NOT NULL CONSTRAINT CHK_AccountName CHECK (dbo.validateAccountName(AccountName) = 1), [Sales] [int] NOT NULL, [Returns] [int] NOT NULL );
但是,當我在正常表上執行相同操作時,會出現語法錯誤。根據 MSFT 文件,表類型的檢查約束應該沒問題。我在這裡想念什麼?有什麼更好的方法來驗證表類型的輸入嗎?
儘管表類型確實允許未命名
CHECK
的約束,但不可能在其中使用使用者定義的函式。錯誤資訊是:
消息 2785 級別 16 狀態 1 第 3 行
使用者定義的函式、使用者定義的聚合、CLR 類型和 CLR 類型上的方法不允許在此上下文中的表達式中使用。
消息 1750 級別 16 狀態 0 第 1 行
無法創建約束。請參閱以前的錯誤。
查看db<>fiddle展示
從https://stackoverflow.com/questions/53330114/user-defined-table-type-with-check-constraint嘗試這個解決方案
CREATE TYPE [dbo].[Accounts] AS TABLE( [AccountName] [varchar](25) NOT NULL CHECK (dbo.validateAccountName(AccountName) = 1), [Sales] [int] NOT NULL, [Returns] [int] NOT NULL );