2009-02-06 27 views
2

在MSSQL 2005中創建一個類型的推薦方式是使用默認值和檢查約束以在幾個列中使用?在SQL Server 2005中創建一個具有默認值和檢查約束的類型

我不想爲每個列添加檢查約束和默認值。

我的第一個想法是創建一個默認和規則來綁定到這種類型,但在線書籍明確指出,我們應該避免使用CREATE DEFAULT和CREATE RULE來進行新的開發,因爲這些命令將在未來的版本中被刪除。

回答

1

是的,很好。幸運的是它仍然是所有有SQL Server 2008的羅賓·佩奇在簡單的通話文章解釋了這一切

Robyn Page's SQL Server Data Validation Workbench

(我有一種感覺,我幫了她一點與一個) 只需創建一個類型,並將默認和規則綁定到它。

棄用問題有點令人遺憾。發生的所有事情是規則,類型默認已經不符合SQL標準。現在的首選方法是使用約束來做同樣的事情,但是如果你需要在多個表中統一使用它,那麼它就不那麼優雅了。此外,只有Joe Celko這樣的人才能理解整體的約束。當然,我不知道。

-3

使用檢查約束

例如

create table bla (value varchar(50) 
default 'A' 
constraint CheckValue check (len(value) > 0)) 
go 
insert bla default values 
go 
insert bla values('1') 
go 
insert bla values('') --will fail 
go 
+0

我知道如何把檢查和默認值一列。但我想創建一個TYPE。 – 2009-02-06 14:19:46

+0

您的原始問題沒有說「我不想爲每個列添加檢查約束和默認值」。 – SQLMenace 2009-02-06 15:21:05

+0

你是對的。我補充說,因爲你沒有注意到我原來的問題中的「TYPE」這個詞。 「..創建一個TYPE ...」。 – 2009-02-06 16:37:11

0

也許你可以用一個用戶自定義數據類型實現,但即使如此,你將不得不更改數據類型,爲您的所有列

0

我使用CREATE TYPE和CREATE RULE來設置默認約束,但不是默認值;這仍然是在桌面上完成的,但沒有理由不能。我也喜歡使用命名錶級約束,而不是依賴列級語法的系統生成名稱。

我將這個模板腳本用於我的代碼片段引擎;的 「*」 是置換參數分隔符:

IF NOT EXISTS 
(
    SELECT 
     * 
    FROM 
     INFORMATION_SCHEMA.DOMAINS d 
    WHERE 
     (d.DOMAIN_CATALOG = DB_NAME()) AND 
     (d.DOMAIN_SCHEMA = N'~~Schema.Name~~') AND 
     (d.DOMAIN_NAME = N'Type~~TypeAndRule.Name~~') 
) 
BEGIN 
    PRINT N' ~~Schema.Name~~.Type~~TypeAndRule.Name~~, ~~Schema.Name~~.Rule~~TypeAndRule.Name~~'; 

    EXEC sp_executesql @statement = N'CREATE TYPE ~~Schema.Name~~.Type~~TypeAndRule.Name~~ FROM ~~baseTypeDef~~ NOT NULL;'; 
    EXEC sp_addextendedproperty N'MS_Description', N'Encapsulates XXX.', N'SCHEMA', N'~~Schema.Name~~', N'TYPE', N'Type~~TypeAndRule.Name~~'; 

    EXEC sp_executesql @statement = N'CREATE RULE ~~Schema.Name~~.Rule~~TypeAndRule.Name~~ AS (@value ~~atValueComparison~~);'; 
    EXEC sp_addextendedproperty N'MS_Description', N'Enforces XXX.', N'SCHEMA', N'~~Schema.Name~~', N'RULE', N'Rule~~TypeAndRule.Name~~'; 

    EXEC sp_bindrule @rulename = N'~~Schema.Name~~.Rule~~TypeAndRule.Name~~', @objname = N'~~Schema.Name~~.Type~~TypeAndRule.Name~~'; 
END; 
GO 
  1. TypeAndRule.Name是基本名稱。
  2. Schema.Name是模式;例如DBO。
  3. baseTypeDef是底層類型定義;例如int或nvarchar(50)。
  4. atValueComparison是約束表達式。
  5. IF NOT EXISTS條件允許腳本無誤地運行多次。

CREATE TYPE/RULE語句最初在SQL 2005時間框架中被棄用,並且仍在。我懷疑他們會在2015年之前的任何時候導致腳本錯誤,因爲MS必須保持向後兼容性:-)

0

我使用SQL CLR集成,與我們的數據存儲與一般的類型,如(CHAR,INT)的想法,但當時情境與制約的數據,特別是「檢查」的約束。

在Visual Studio數據庫項目(C#)中創建一個數據類型,該項目在內部將該值存儲爲基本類型(例如int,float,string等),但限制了它可以使用的值。例如,如果您有Score類型,則如果該值超出0到100的範圍,則構造函數將引發錯誤,確保只有有效的Score對象可以存在。

您在數據庫表中的檢查約束只需調用一個CLR函數(您也將在您的數據庫項目中創建),該函數只是嘗試使用傳遞給您的新列值構造C#數據類型的實例它。如果該值構造,則函數成功;如果構造函數拋出錯誤,則該函數失敗。

然後,您有一個約束的數據類型,在C#代碼集中,整個應用程序,這也強制數據庫中的值可用。

相關問題