2010-08-31 3 views
2

Dans SQL Server, en supposant que des colonnes doivent avoir le même type de données, est-il possible de définir une contrainte de vérification au niveau de la table et de l'appliquer à une colonne?Réutilisation des contraintes de vérification

Comme dans cette (pièce) exemple:

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

Comment pouvez maintenant vous associer cela avec une ou plusieurs colonnes ayant créée au niveau de la table ou est la réponse à cette utiliser une règle à savoir.

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

Je sais que l'exemple est contraint et on utiliserait une colonne décimale pour les valeurs décimales mais supposons, en raison d'un choix de conception médiocre, que c'était une colonne nchar et que vous vouliez faire respecter certaines contraintes sur elle.

Répondre

2

Bien que les règles répondent à vos exigences, elles sont désormais obsolètes en faveur des anciennes contraintes de vérification. Il ne serait pas judicieux d'utiliser des règles si vous pensez que la base de données doit être déplacée vers les futures versions de SQL Server. Voir le message "important" en haut de la documentation MSDN: http://msdn.microsoft.com/en-us/library/ms188064.aspx.

Vous pouvez obtenir une réutilisation en utilisant une fonction définie par l'utilisateur et l'appeler dans toutes les contraintes de vérification, mais vous devrez toujours définir explicitement les contraintes de vérification sur toutes les colonnes où elle s'applique.

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 
+0

Daniel, Un grand merci pour cela. Il semble dommage que les règles soient déconseillées mais c'est la vie en informatique je suppose :-) Je vais prendre et adapter votre suggestion - merci beaucoup! – noonand

+0

Cela fonctionnerait, mais les performances des UDF scalaires sont terribles. –

1

Votre contrainte est une contrainte de type.

Avec SQL, vous pouvez faire face à cette situation grâce à des types définis par l'utilisateur, où votre « réutilisation » est matérialisée en déclarant plusieurs colonnes à être de ce type,

ou vous devez répéter la contrainte de type comme CHÈQUE contrainte pour chaque colonne individuelle.

+0

Je ne pense pas qu'il soit possible d'associer une contrainte de vérification à un type personnalisé. Il est certainement possible d'utiliser un type CLR mais ce n'est souvent pas une option et a certainement un impact sur les performances. –

+0

Erwin Je ne pense pas vraiment que tout UDT est de redéfinir un type déjà existant avec un nom ou une longueur plus approprié: sp_addtype birthday, datetime, 'NULL'; OU sp_addtype N'CustomerName ', nvarchar (20), non null – noonand

Questions connexes