2011-01-10 4 views
1

В настоящее время я использую задание агента SQL Server для создания таблицы основных пользователей для своих внутренних веб-приложений, потянув данные из 3 других баз данных; Sharepoint, система управления практикой и наша база данных о персонале.Обновление таблицы SQL со значениями из другого вложенного запроса

В настоящее время идет ...

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 

Проблема заключается в том, что вся таблица очищается в качестве первого шага, так мой автоматическое приращение первичного ключа/идентифицируются на tb_staff наверняка изменится. Также, если кто-то удаляется из sharepoint или PMS, они не будут воссозданы в этой таблице, и это приведет к несогласованности всей базы данных.

Я хочу сохранить записи в этой таблице, даже после того, как они удалены из одной из других систем.

Я полагаю, что я хочу сделать, это: 1) Отметить все покидающие записи в tb_staff как неактивный (используя столбец активной и установить его на ложь) 2) Выполнить запрос на три присоединились таблицы и обновлять каждый найденные записи, также отмечая их как активные.

Я не вижу, как я могу вложить оператор select в оператор обновления, как это имеет место здесь с инструкцией Insert.

Как я могу достичь этого, пожалуйста?

* обратите внимание, что я отредактировал свой SQL до 4 столбцов и упростил его, поэтому небольшие ошибки, вероятно, связаны с поспешным редактированием. Реальный запрос намного больше.

+0

Также как и обновление флага, вы также хотите вставить новых пользователей? Если да, то в какой версии SQL Server вы работаете? Надеюсь, 2008 год, поэтому вы можете использовать 'merge'! –

+0

Да, я хочу обновить существующие записи и добавить новые. Я использую SQL Server 2008. – Yeodave

+0

Прежде чем вы обрезаете таблицу, вы можете поместить данные во временную таблицу, чтобы вы могли разрешить различия после завершения процесса? – Suirtimed

ответ

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. Хороший ответ, но не помешало включить ссылку на MERGE http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

Работал отлично. Раньше я никогда не слышал об этой команде. Я испугался, что мне придется что-то делать с помощью курсоров. Огромное спасибо! – Yeodave

Смежные вопросы