SQL Server 2008: aiuto nella scrittura di un semplice trigger INSERT

Questo è con Microsoft SQL Server 2008.

Ho 2 tavoli, Employee e EmployeeResult e sto provando a scrivere un semplice trigger INSERT su EmployeeResult che esegue questa operazione – ogni volta che viene eseguito un INSERT in EmployeeResult come:

(Jack, 200, Vendite) (Jane, 300, Marketing) (John, 400, Ingegneria)

Dovrebbe cercare le coppie di voci Nome, Dipartimento, come

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

all’interno della tabella Employee e se tale dipendente non esiste, deve inserirlo nella tabella Employee.

Quello che ho è questo con sconosciuti 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 

Per favore aiuto, grazie in anticipo

Schema:

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

Si 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 è ansible accedere alle tabelle logiche inserite ed eliminate che rappresentano rispettivamente i dati nuovi e originali).

Pertanto, per inserire coppie di dipendenti / reparti che al momento non esistono, è ansible provare qualcosa di simile al 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 

cmsjr aveva 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 triggersno una volta per ogni batch di record inseriti, eliminati o aggiornati. Quindi se dieci record sono stati inseriti in un batch, il trigger si triggers 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. È ansible 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.

Potresti pensare che nessuno aggiungerà mai più record, ma succede più frequentemente di quanto la maggior parte delle persone non di database realizzino. Non scrivere un trigger che non funzioni in tutte le possibili operazioni di inserimento, aggiornamento, cancellazione. Nessuno userà il metodo di un record alla volta quando dovrà importare 1.000.000 di record di vendita da un nuovo cliente o aggiornare tutti i prezzi del 10% o eliminare tutti i record di un venditore i cui prodotti non vendono più.

controlla 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