2009-08-31 8 views
15

Questo è con Microsoft SQL Server 2008.SQL Server 2008 - Aiuto scrittura semplice INSERT trigger

Ho 2 tavoli, dei dipendenti e EmployeeResult e sto cercando di scrivere un semplice trigger INSERT su EmployeeResult che fa questo - ogni volta che un INSERT è fatto in EmployeeResult come ad esempio:

(Jack, 200, vendite) (Jane, 300, Marketing) (Giovanni, 400, Ingegneria)

occorre guardare in alto per il nome , Coppie di voci di reparto, ad esempio

(Jack, vendite), (Jane, Marketing), (John, Ingegneria)

all'interno della tabella dei dipendenti, e se un tale lavoratore non esiste, dovrebbe inserire che nella tabella Employee.

Quello che ho è questo con incognite su come risolvere il "???" s:

CREATE TRIGGER trig_Update_Employee 
ON [EmployeeResult] 
FOR INSERT 
AS 
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???) 
    BEGIN 
    INSERT INTO [Employee] (Name, Department) VALUES (???, ???) 
    END 

prega di aiuto, grazie in anticipo

schema:

Employee 
-------- 
Name, varchar(50) 
Department, varchar (50) 

EmployeeResult 
-------------- 
Name, varchar(50) 
Salary, int 
Department, varchar (50) 

risposta

58

È desidera sfruttare la tabella logica inserita disponibile nel contesto di un trigger. Corrisponde allo schema per la tabella che viene inserita e include le righe che verranno inserite (in un trigger di aggiornamento è possibile accedere alle tabelle inserite e eliminate che rappresentano i dati nuovi e originali rispettivamente.)

Quindi per inserire coppie Impiegato/reparto che non esistono attualmente si potrebbe provare qualcosa di simile alla seguente.

CREATE TRIGGER trig_Update_Employee 
ON [EmployeeResult] 
FOR INSERT 
AS 
Begin 
    Insert into Employee (Name, Department) 
    Select Distinct i.Name, i.Department 
    from Inserted i 
    Left Join Employee e 
    on i.Name = e.Name and i.Department = e.Department 
    where e.Name is null 
End 
23

cmsjr ha la soluzione giusta. Volevo solo sottolineare un paio di cose per il tuo futuro sviluppo di trigger. Se stai usando la dichiarazione dei valori in un inserto in un trigger, c'è una forte possibilità che tu stia facendo la cosa sbagliata. I trigger si attivano una volta per ogni batch di record inseriti, eliminati o aggiornati. Quindi se dieci record sono stati inseriti in un batch, il trigger si attiva una volta. Se si fa riferimento ai dati nell'inserito o eliminato e utilizzando le variabili e la clausola valori, si otterranno solo i dati per uno di tali record. Ciò causa problemi di integrità dei dati. È possibile risolvere questo problema utilizzando un inserto basato su set come cmsjr mostra sopra o usando un cursore. Non scegliere mai il percorso del cursore. Un cursore in un trigger è un problema in attesa di accadere in quanto sono lenti e potrebbe bloccare il tuo tavolo per ore. Ho rimosso un cursore da un trigger una volta e migliorato un processo di importazione da 40 minuti a 45 secondi.

Si potrebbe pensare che nessuno è mai andare a aggiungere più record, ma accade più frequentemente di quanto la maggior parte delle persone non si rendono conto di database. Non scrivere un trigger che non funzioni in tutte le possibili operazioni di inserimento, aggiornamento, cancellazione. Nessuno sta andando a utilizzare il un record alla metodo di momento in cui devono importare 1.000.000 record di destinazione delle vendite da un nuovo cliente o aggiornare tutti i prezzi del 10% o eliminare tutti i record da un fornitore i cui prodotti non si vende più.

+1

+1: dettaglio extra era disponibile. –

2

controllo di questo codice:

CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin 
    Insert into Employee (Name, Department) 
    Select Distinct i.Name, i.Department 
     from Inserted i 
     Left Join Employee e on i.Name = e.Name and i.Department = e.Department 
     where e.Name is null 
End