Sql-Server-2012

具有檢查約束的使用者定義表類型

  • April 15, 2020

我有一個使用者定義的表類型,我想確保某個列在給定範圍內。然而,這個範圍在另一個表中定義。所以我想我可以在這個列上使用一個帶有標量值函式的檢查約束。

   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
);

引用自:https://dba.stackexchange.com/questions/58348