Domanda

Ho due tabelle, la prima ha una chiave primaria che è un'identità, la seconda ha una chiave primaria che non lo è, ma quella chiave ha un vincolo di chiave esterna sulla chiave primaria della prima tabella.

Se inserisco un record alla volta, posso usare Scope_Identity per ottenere il valore per il pk appena inserito nella tabella 1 che voglio inserire nella seconda tabella.

Il mio problema è che ho molti record provenienti da selezioni che voglio inserire in entrambe le tabelle, non sono stato in grado di pensare a un modo basato su set per fare questi inserti.

La mia attuale soluzione è usare un cursore, inserire nella prima tabella, ottenere la chiave usando scope_identity, inserire nella seconda tabella, ripetere.

Mi manca una soluzione non cursore?

È stato utile?

Soluzione

Sì, cerca la clausola di output in Libri online.

Altri suggerimenti

Ho avuto questo problema proprio questa settimana: qualcuno aveva introdotto una tabella con una chiave surrogata insignificante nello schema in cui vengono usate naturalmente le chiavi. Senza dubbio lo risolverò presto :) fino ad allora, ci sto lavorando creando una tabella di dati da INSERT da: questa potrebbe essere una tabella di base permanente o temporanea o una tabella derivata ( vedi sotto), che dovrebbe comunque soddisfare il tuo desiderio di una soluzione basata su set. Utilizzare un join tra questa tabella e la tabella con la colonna IDENTITY sulla chiave naturale per scoprire i valori generati automaticamente. Ecco un breve esempio:

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top