Question

J'ai deux tables, la première a une clé primaire qui est une identité, la seconde a une clé primaire qui ne l'est pas, mais cette clé a une contrainte de clé étrangère sur la clé primaire de la première table.

Si j'insère un enregistrement à la fois, je peux utiliser Scope_Identity pour obtenir la valeur du pk qui vient d'être inséré dans le tableau 1 que je souhaite insérer dans le deuxième tableau.

Mon problème est que j'ai beaucoup d'enregistrements provenant de sélections que je veux insérer dans les deux tableaux. Je n'ai pas été en mesure de penser à une méthode basée sur les ensembles pour effectuer ces insertions.

Ma solution actuelle consiste à utiliser un curseur, à insérer dans le premier tableau, à obtenir une clé à l'aide de scope_identity, à insérer dans un deuxième tableau, à répéter.

Me manque-t-il d'une solution sans curseur?

Était-ce utile?

La solution

Oui, recherchez la clause de sortie dans la documentation en ligne.

Autres conseils

J'ai eu ce problème juste cette semaine: quelqu'un avait introduit une table avec une clé de substitution sans signification dans le schéma où les clés sont naturellement utilisées. Nul doute que je réglerai ça bientôt :) Jusque-là, je travaille à cela en créant une table de données à INSERT à partir de: cela pourrait être une table de base permanente ou temporaire ou une table dérivée ( voir ci-dessous), qui devrait de toute façon convenir à votre désir d’une solution basée sur un ensemble. Utilisez une jointure entre cette table et la table avec la colonne IDENTITY sur la clé naturelle pour rechercher les valeurs générées automatiquement. Voici un bref exemple:

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top