Inserisci con OUTPUT correlato alla tabella delle query secondarie


22

Sto modificando la struttura di un database. Il contenuto di più colonne della tabella FinancialInstitution deve essere trasferito nella tabella Person . FinancialInstitution è collegato a Persona con una chiave esterna. Ogni istituto finanziario necessita dell'ID della persona corrispondente. Pertanto, per ogni nuova riga inserita in Persona, l'ID di questa nuova riga (IDENTITÀ) deve essere copiato nuovamente nella riga corrispondente di FinancialInstitution.

Il modo ovvio per farlo è un codice T-SQL iterativo. Ma sono interessato a sapere se è possibile farlo solo con operazioni basate su set.

Ho immaginato che il livello interno di una tale richiesta sarebbe stato qualcosa del tipo:

INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;

Sfortunatamente, sembra che OUTPUT non possa essere correlato in questo modo ...


Vuoi inserire righe nella tabella Person? O aggiorni quelli esistenti? O vuoi inserire in Persone poi UPDATE FinancialInstitution?
ypercubeᵀᴹ

La tua query aggiorna solo la tabella Persona. È possibile acquisire l'ID inserito, ma non il FinancialInstitution.ID a meno che non lo si usi nella parte Inserisci. Nel modo in cui si trova la query, se si rimuove la clausola OUTPUT, si otterrebbe un errore perché il numero di colonne nell'istruzione INSERT non corrisponde all'istruzione SELECT.
datagod

ypercube: voglio inserire in persona e quindi aggiornare FinancialInstitution con l'ID della nuova riga in persona.
Yugo Amaryl,

datagod: conosco il suo unico aggiornamento, questa query è il livello nidificato della soluzione futura. Ma sono già bloccato lì. Giusto, non posso aggiungere Id nella selezione se non lo inserisco.
Yugo Amaryl

1
@YugoAmaryl, puoi provare ad adottare questo esempio utilizzando la clausola OUTPUT per
acquisire

Risposte:


18

Immagino che potresti (ab) usare MERGEper questo. Innanzitutto crea una tabella (temporanea):

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Quindi MERGEin Person(anziché INSERT), in modo da poter utilizzare le colonne delle tabelle coinvolte nella OUTPUTclausola:

MERGE INTO Person 
USING FinancialInstitution AS fi
  ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (Street1, Number1, City1, ...)
  VALUES (fi.Street, fi.Number, fi.City, ...)
OUTPUT inserted.Id, fi.Id
  INTO tempIDs ;

Quindi utilizzare la tabella temporanea per UPDATE FinancialInstitution:

UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
  JOIN tempIDs AS t
    ON fi.Id = t.FinancialInstitutionId ; 

Test su: SQL-Fiddle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.