2010-06-08 2 views
0

Est-il possible de créer une table qui a une contrainte de vérification sur une de la colonne dont la valeur est dans le jeu de résultat donné par une autre requête SQLPuis-je créer une table avec contrôle Contraindre dont les valeurs dépendent de requêtes SQL

par exemple.

create table tablename 
(
name varchar(10), 
rollno int 
)check rollno in (select rollno from anotherDatabase.TableName,candidateRoll) 

ou n'importe quoi de pareil.

Je ne dois pas l'utiliser n'importe où, mais je veux toujours savoir.

Répondre

2

Si vous ne parvenez pas à obtenir ce que vous voulez avec une référence de clé étrangère, vous pouvez le faire si vous enveloppez l'instruction SELECT dans un appel de fonction.

Votre chèque expression de contrainte peut ressembler à quelque chose comme:

(dbo.SomeFunction([col1]) != 0) 

La fonction pourrait ressembler à ceci (en supposant que la colonne est un varchar):

create function dbo.SomeFunction(@arg varchar(max)) 
returns bit 
as 
begin 
return 
(
    select count(*) from SomeOthertable where col2 = @arg 
) 
end 

EDIT (09.06.2010): En ce qui concerne le commentaire d'Anthony, mes tests ont montré qu'une valeur count(*) supérieure à 1 est toujours retournée comme 1. Donc, il semblerait que la fonction soit correcte, même si elle devrait probablement renvoyer explicitement 1 ou 0. Ou, si vous êtes intéressé par le rowcount réel, changez le type de retour de BIT à INT.

+0

Bonne solution. Le convoyeur implicite de int à bit est légèrement effrayant cependant, que se passe-t-il si COUNT (*)> 1? –

+0

Oui bon point. Je n'ai jusqu'ici utilisé cette approche que sur les clés primaires, donc la possibilité de COUNT (*)> 1 est nulle. –

1

Oui: la clé étrangère même base de données liens

create table tablename 
(
name varchar(10), 
rollno int FOREIGN KEY (candidateRoll) REFERENCES OtherTableName (candidateRoll) 
) 

Si c'est une autre base de données, puis utiliser le code par exemple insérer via proc stocké ou appliquer via un déclencheur

+0

Mais il n'est pas possible d'appliquer une relation de base de données croisée – Madhivanan

+0

@Madhivanan: à proprement parler, il n'existe pas de «relation de base de données croisée». Si c'est lié, c'est la même base de données. J'ai également mentionné les déclencheurs et les procédures stockées pour ce scénario. – gbn

Questions connexes