2011-01-10 14 views
1

Ich verwende derzeit einen SQL Server-Agent-Job, um eine Master-Benutzertabelle für meine internen Webanwendungen zu erstellen, wobei Daten aus 3 anderen Datenbanken abgerufen werden. Sharepoint, Praxis-Management-System und unsere HR-Datenbank.Aktualisieren einer SQL-Tabelle mit Werten aus einer anderen verschachtelten Abfrage

Derzeit geht es ...

truncate table my_tools.dbo.tb_staff 
go 
insert into my_tools.dbo.tb_staff 
(username 
,firstname 
,surname 
,chargeoutrate) 

    select right(wss.nt_user_name, 
    ,hr.firstname 
    ,hr.surname 
    ,pms.chargeoutrate 

    from sqlserver.pms.dbo.staff as pms 

    inner join sqlserver.wss_content.dbo.vw_staffwss as wss 
on pms.nt_user_name = wss.nt_user_name 

    inner join sqlserver.hrdb.dbo.vw_staffdetails as hr 
on wss.fullname = hr.knownas 
go 

Das Problem ist, dass die gesamte Tabelle als erster Schritt wird gelöscht, so mein Autoinkrement Primärschlüssel/identifiziert auf tb_staff ist sicher, zu ändern. Auch wenn jemand aus dem Sharepoint oder dem PMS entfernt wird, werden sie in dieser Tabelle nicht neu erstellt und dies führt zu Inkonsistenzen in der gesamten Datenbank.

Ich möchte Einträge in dieser Tabelle beibehalten, auch nachdem sie von einem der anderen Systeme entfernt wurden.

nehme ich, was ich tun möchte, ist: 1) Markieren Sie alle austretenden Einträge in tb_staff als inaktiv (eine Spalte namens aktiv und setzen Sie ihn auf false) 2) Führen Sie die Abfrage unter Verwendung von auf die drei Tabellen verknüpft und bei jedem Update gefundene Aufzeichnung, die sie auch als aktiv markiert.

Ich kann nicht sehen, wie ich eine Select-Anweisung innerhalb einer Update-Anweisung verschachteln kann, wie ich hier mit der Insert-Anweisung habe.

Wie kann ich das bitte erreichen?

* Bitte beachten Sie Ich habe meine SQL bis 4 Spalten redigiert und es so vereinfacht, so kleine Fehler sind wahrscheinlich wegen der überstürzten Bearbeitung. Die echte Abfrage ist viel größer.

+0

Neben der Aktualisierung der Flagge möchten Sie auch neue Benutzer einfügen? Wenn ja, welche Version von SQL Server sind Sie? Hoffentlich 2008, also kannst du 'merge' verwenden! –

+0

Ja, ich möchte bestehende Einträge aktualisieren und neue hinzufügen. Ich verwende SQL Server 2008. – Yeodave

+0

Bevor Sie die Tabelle abschneiden können Sie die Daten in eine temporäre Tabelle, damit Sie Unterschiede nach Abschluss Ihres Prozesses beheben können? – Suirtimed

Antwort

3
WITH source AS(
SELECT RIGHT(wss.nt_user_name, 10) nt_user_name, /*Or whatever - this is invalid in the original SQL*/ 
     hr.firstname, 
     hr.surname, 
     pms.chargeoutrate 
FROM staff AS pms 
     INNER JOIN vw_staffwss AS wss 
     ON pms.nt_user_name = wss.nt_user_name 
     INNER JOIN vw_staffdetails AS hr 
     ON wss.fullname = hr.knownas 
) 
MERGE 
     INTO tb_staff 
     USING source 
     ON source.nt_user_name= tb_staff.username /*Or whatever you are using as the key */ 
      WHEN MATCHED 
      THEN UPDATE SET active=1 /*Can synchronise other columns here if needed*/ 
     WHEN NOT MATCHED BY TARGET 
      THEN INSERT (username, firstname, surname, chargeoutrate, active) VALUES (nt_user_name,firstname, surname, chargeoutrate, 1) 
     WHEN NOT MATCHED BY source 
      THEN UPDATE SET active=0; 
+0

+1 @Martin. Nette Antwort, aber es konnte nicht schaden, einen Link zu MERGE zu integrieren http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

Arbeitete perfekt. Ich hatte noch nie zuvor von diesem Befehl gehört. Ich hatte Angst, ich müsste etwas mit Cursors machen. Vielen Dank! – Yeodave

Verwandte Themen