6
votes

Mettre à jour le champ de clé étrangère de l'enregistrement basé sur une clé primaire de l'enregistrement nouvellement inséré

Pour chaque enregistrement dans le tableau AI Vous souhaitez mettre à jour la valeur de la clé étrangère de l'un des champs en fonction de la portée de l'enregistrement neuf inséré dans le tableau B.

Je dois créer un nouvel enregistrement dans le tableau B pour chaque enregistrement dans le tableau A Afin de recevoir une clé étrangère (Scope_Identity). p>

Par exemple, pour chaque ligne du tableau suivant, je souhaite mettre à jour le champ NULL étranger de la clé étrangère en fonction de la création d'une nouvelle ligne de ligne / étrangère dans le tableau B . P>

Table A: P>

update TableA 
set ForeignKey = (INSERT INTO TableB VALUES (value1) select SCOPE_IDENTITY())


1 commentaires

Je suis désolé, j'ai raté cette information. Supprimer le commentaire.


3 Réponses :


6
votes

Vous pouvez utiliser un curseur pour boucle via Tablea et créer les enregistrements:

DECLARE @Id int
DECLARE @ForeignKey int

DECLARE C CURSOR FOR SELECT Id FROM TableA

OPEN C

FETCH NEXT FROM C INTO @Id

WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO TableB VALUES (value1)
    SET @ForeignKey = SCOPE_IDENTITY()

    UPDATE TableA
    SET ForeignKey = @ForeignKey
    WHERE Id = @Id

    FETCH NEXT FROM C INTO @Id
END

CLOSE C
DEALLOCATE C


0 commentaires

0
votes

La manière basée sur l'ensemble de la mise à jour est corrélée à un insert dans SQL Server 2008 et ultérieurement consiste à utiliser un Fusionner ... Sortie déclaration. XXX

Depuis l'instruction insertion (même dans l'insert ... Sélectionnez le formulaire) n'a pas de clause, de_table_name ne peut pas être référencé dans sa clause de sortie pour capturer la corrélation complète . Étant donné que la fusion considère toujours sa clause d'utilisation de la clause de la clause, il peut être utilisé pour imiter l'insert ... Sélectionnez Construire tout en donnant accès aux tables source et de destination dans la sortie.

Utilisation de la fusion .. .Output Pour créer une mise à jour corrélée à un insert remplace l'utilisation inefficace des solutions RBAR à l'aide de curseurs ou de boucles avec la maintenance d'une seule table temporaire ou une variable valorisée de table.


0 commentaires

0
votes

Une autre méthode que j'ai trouvée utilise Row_Number fonction pour rejoindre arbitrairement les tables, puis utilisez cette requête dérivée pour mettre à jour le FK. L'idée est qu'il n'y a pas une relation mais forte> entre tablea et tablebons, nous avons juste besoin de les lier pour attraper les nouvelles clés étrangères. Les rejoindre sur quelque chose d'arbitraire comme Row_Number nous donne une méthode pour choisir une seule ligne pour saisir l'ID de.

Créer les nouveaux enregistrements d'abord p>

CREATE TABLE tableA (Id INT, ForeignKey INT)
INSERT INTO tableA VALUES (100,NULL),(200,NULL),(300,NULL)


CREATE TABLE tableB (TheNewId INT)
INSERT INTO tableB VALUES(5000),(6000),(7000)


0 commentaires