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())
3 Réponses :
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
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. Depuis l'instruction insertion (même dans l'insert ... Sélectionnez le formulaire) n'a pas de clause, 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. P> P> de_table_name code> 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. P>
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 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)
Je suis désolé, j'ai raté cette information. Supprimer le commentaire.