Share via


CREATE RULE (Transact-SQL)

建立一個稱為規則的物件。當繫結到資料行或別名資料類型時,規則會指定能夠插入這個資料行的可接受的值。

ms188064.note(zh-tw,SQL.90).gif重要事項:
在未來的 Microsoft SQL Server 版本中,將移除 CREATE RULE。請避免在新的開發工作中使用 CREATE RULE,並規劃修改目前使用 CREATE RULE 的應用程式。我們建議您改用 CHECK 條件約束。CHECK 條件約束是利用 CREATE TABLE 或 ALTER TABLE 的 CHECK 關鍵字來建立的。如需詳細資訊,請參閱<CHECK 條件約束>。

資料行或別名資料類型只能有一個繫結的規則。不過,資料行可以同時有一個規則以及一或多個相關聯的檢查條件約束。在這個情況下,會評估所有限制。

主題連結圖示Transact-SQL 語法慣例

語法

CREATE RULE [ schema_name . ] rule_name 
AS condition_expression
[ ; ]

引數

schema_name

這是規則所屬的結構描述名稱。

rule_name

這是新規則的名稱。規則名稱必須符合識別碼的規則。您可以選擇性地指定規則擁有者名稱。

condition_expression

這是定義規則的一或多個條件。規則可以是 WHERE 子句中任何有效的運算式,可以包括算術運算子、關係運算子和述詞 (如 IN、LIKE、BETWEEN) 之類的元素。規則不能參考資料行或其他資料庫物件。未參考資料庫物件的內建函數可以包括在內。無法使用使用者自訂函數。

condition_expression 包括一個變數。每個本機變數前面都會有 @ 記號 (@)。這個運算式參考 UPDATE 或 INSERT 陳述式所輸入的值。當建立規則時,您可以利用任何名稱或符號來代表值,但第一個字元必須是 @ 記號 (@)。

ms188064.note(zh-tw,SQL.90).gif附註:
請避免建立使用別名資料類型之運算式的規則。雖然您可以建立使用別名資料類型之運算式的規則,但在規則繫結到資料行或別名資料類型之後,當參考運算式時,會無法編譯運算式。

備註

CREATE RULE 無法在單一批次中,與其他 Transact-SQL 陳述式結合起來。規則不適用於建立規則時已在資料庫中的資料,規則無法繫結到系統資料類型。如需詳細資訊,請參閱<資料類型 (Database Engine)>。

規則只能建立在目前資料庫中。建立好規則之後,請執行 sp_bindrule,將規則繫結到資料行或別名資料類型。規則必須相容於資料行資料類型。例如,"@value LIKE A%" 不能用來作為數值資料行的規則。規則無法繫結到 textntextimagevarchar(max)nvarchar(max)varbinary(max)xml、CLR 使用者自訂類型或 timestamp 資料行。規則無法繫結到計算資料行。

請用單引號 (') 括住字元和日期常數,二進位常數前面要附加 0x。如果規則與所繫結的資料行不相容,SQL Server Database Engine 會在插入值時 (而不是繫結規則時),傳回一則錯誤訊息。

只有在您試圖將值插入別名資料類型的資料庫資料行或更新這個資料行時,才會啟動繫結到別名資料類型的規則。由於規則不會測試變數,因此,不會將值指派給繫結到相同資料類型之規則所拒絕的別名資料類型變數。

若要取得規則的報表,請使用 sp_help。若要顯示規則的文字,請將規則名稱設為參數來執行 sp_helptext。若要重新命名規則,請使用 sp_rename

在建立同名的新規則之前,您必須先利用 DROP RULE 來卸除舊規則,在卸除舊規則之前,必須先利用 sp_unbindrule 來解除它的繫結。若要解除規則和資料行的繫結,請使用 sp_unbindrule

您可以在未解除先前繫結的情況下,將新規則繫結到資料行或資料類型;新規則會覆寫先前的規則。繫結到資料行的規則,一律優先於繫結到別名資料類型的規則。將規則繫結到資料行,會取代已繫結到這個資料行的別名資料類型之規則。但將規則繫結到資料類型,並不會取代繫結到這個別名資料類型之資料行的規則。下表顯示將規則繫結到資料行,或繫結到規則已存在的別名資料類型時,所採用的優先順序。

新規則繫結到 舊規則繫結到 別名資料類型 舊規則繫結到 資料行

別名資料類型

取代舊規則

沒有變更

資料行

取代舊規則

取代舊規則

如果資料行有預設值及其相關聯的規則,預設值必須在規則所定義的網域內。永遠不會插入與規則衝突的預設值。SQL Server Database Engine 每次嘗試插入這類預設值時,都會產生一則錯誤訊息。

ms188064.note(zh-tw,SQL.90).gif附註:
相容性層級設定決定了 Database Engine 要將空字串解譯成單一空格或真正的空字串。如果相容性層級小於或等於 65,Database Engine 會將空字串解譯為單一空格。如果相容性層級等於 70,Database Engine 會將空字串解譯為空字串。如需詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。

權限

若要執行 CREATE RULE,使用者至少必須有目前資料庫中的 CREATE RULE 權限,以及正在建立規則之結構描述的 ALTER 權限。

範例

A. 利用範圍來建立規則

下列範例會建立一個規則來限制插入這個規則所繫結之一或多個資料行的整數範圍。

CREATE RULE range_rule
AS 
@range>= $1000 AND @range <$20000;

B. 利用清單來建立規則

下列範例會建立一個規則,將輸入 (這個規則所繫結的) 資料行之實際值限制在規則所列出的值。

CREATE RULE list_rule
AS 
@list IN ('1389', '0736', '0877');

C. 利用模式建立規則

下列範例會建立一個遵照下列模式的規則:任兩個字元後面接著連字號 (-),再接著任意數目的字元或不接任何字元,再以 09 的整數作為結尾。

CREATE RULE pattern_rule 
AS
@value LIKE '__-%[0-9]'

請參閱

參考

ALTER TABLE (Transact-SQL)
CREATE DEFAULT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DROP DEFAULT (Transact-SQL)
DROP RULE (Transact-SQL)
運算式 (Transact-SQL)
sp_bindrule (Transact-SQL)
sp_help (Transact-SQL)
sp_helptext (Transact-SQL)
sp_rename (Transact-SQL)
sp_unbindrule (Transact-SQL)
WHERE (Transact-SQL)

其他資源

批次
將識別碼當成物件名稱使用

說明及資訊

取得 SQL Server 2005 協助