2011-08-23 8 views
1

Je travaille sur un projet et la question a été soulevée: une instruction d'insertion peut-elle insérer sa propre identité dans un autre champ? L'idée est qu'il y aurait une disposition hiérarchique des enregistrements et que le champ 'parent' pointerait vers l'ID de l'enregistrement parent et que l'enregistrement 'haut' pour un arbre donné pointerait juste vers lui-même.Identification de la ligne d'insertion en cours

Nous pourrions bien sûr laisser juste la valeur null pour le parent ou revenir et insérer son ID plus tard. Mais je me demandais s'il y avait une opération SQL Server pour insérer une IDENTITY dans un autre champ que l'enregistrement est en cours d'insertion?

EDIT: Ou existe-t-il un moyen de spécifier la valeur par défaut pour qu'un champ soit la valeur d'un autre champ? Cela réglerait également le problème.

EDIT: Le champ par défaut étant un autre champ a déjà été répondu il semble, et la réponse est non, utilisez un déclencheur. Bien sûr, cela n'aide pas le problème des contraintes et des champs non nuls. (http://social.msdn.microsoft.com/Forums/en/sqltools/thread/661d3dc8-b053-47b9-be74-302ffa11bf76)

Répondre

0

No. Pour ce genre de hiérarchie à moins que vous insérez ID explicites les valeurs avec SET IDENTITY_INSERT ON vous devez insérer le niveau supérieur en premier et utiliser SCOPE_IDENTITY ou la clause OUTPUT pour obtenir les insérer ID s à utiliser pour la prochaine descendre d'un niveau.

0

Dans une certaine mesure, vous pouvez. L'insertion permet la clause OUTPUT et la OUTPUT peut être redirigée dans une table qui peut être la même table que celle dans laquelle vous insérez actuellement. L'exemple suivant insère un nœud parent mais aussi insère automatiquement un nœud enfant qui a le parent_id réglé sur l'ID nouvellement généré au cours d'insertion:

create table hierarchy (
    id int identity(1,1) not null primary key, 
    parent_id int null, 
    somefield varchar(100)); 


insert into hierarchy (parent_id, somefield) 
    output inserted.id, 'child' 
    into hierarchy (parent_id, somefield) 
values (null, 'parent');  

select * from hierarchy; 

Je ne vois aucune utilité pratique à la fin cependant, c'est plus d'un hat-trick de spectacle.

+0

C'est très utile à savoir, mais je cherche à insérer un seul enregistrement avec l'ID dans un autre champ en plus du champ ID. La raison de ceci serait seulement dans les cas où l'enregistrement était l'enregistrement parent et donc il se définirait comme le parent au lieu d'un autre enregistrement préexistant. – cjbarth

Questions connexes