3

SQL Serverでは、同じデータ型を持つ必要のある列があると仮定して、テーブル(またはデータベースレベル)でチェック制約を定義し、それを定義するときに列に適用することは可能ですか?

この(考案された)例のように:

ALTER TABLE dbo.tblAuditTrail
ADD CONSTRAINT CK_DecimalNumber
CHECK (DecimalColumn LIKE '^\-?\d+\.\d+$')
GO

これをテーブルレベルで作成した1つ以上の列と関連付けることができますか、それともRULEvizを使用するための答えです。

CREATE RULE RU_Decimal
AS
@value LIKE '^\-?\d+\.\d+$'
GO

この例は考案されたものであり、10進値に10進列を使用することは知っていますが、設計上の選択が不十分なため、これはnchar列であり、いくつかの制約を適用したいと想定しています。

4

2 に答える 2

3

ルールは要件を満たしていますが、従来のチェック制約を優先して非推奨になりました。データベースを将来のバージョンのSQLServerに移動する必要があると思われる場合は、ルールを使用することはお勧めできません。MSDNドキュメントの上部にある「重要な」メッセージを参照してください:http://msdn.microsoft.com/en-us/library/ms188064.aspx

ユーザー定義関数を使用して再利用し、すべてのチェック制約で呼び出すことができますが、それが適用されるすべての列でチェック制約を明示的に定義する必要があります。

CREATE FUNCTION IsDecimal(@input varchar(max))
RETURNS bit
AS 
BEGIN
    IF @value LIKE '^\-?\d+\.\d+$'
        RETURN 1
    ELSE
        RETURN 0
END
GO 

ALTER TABLE dbo.tblAuditTrail     
    ADD CONSTRAINT CK_DecimalNumber     
    CHECK (dbo.IsDecimal(DecimalColumn) = 1)     
GO
于 2010-08-31T10:02:02.887 に答える
1

制約は型制約です。

SQLを使用すると、ユーザー定義の型を使用してこの状況に対処できます。この場合、複数の列をこの型であると宣言することで「再利用」が実現されます。

または、個々の列ごとにCHECK制約としてタイプ制約を繰り返す必要があります。

于 2010-08-31T10:03:49.603 に答える