2011-01-10 70 views
1

我正在使用SQL Server代理作业为我的内部Web应用程序创建主用户表,从其他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是一定要改变。另外,如果有人从共享点或PMS中删除,则不会在此表上重新创建,这会导致整个数据库不一致。

我想保留此表中的条目,即使它们从其他系统之一中删除后也是如此。

我想我想要做的是: 1)马克在tb_staff全部退出条目为不活动(使用所谓的主动,并将其设置为false列) 2)运行查询的三个连接表和更新每个找到记录,也标记为活跃。

我看不到如何在Update语句中嵌套select语句,就像我在这里使用Insert语句一样。

我该如何做到这一点?

*请注意我已经将我的SQL编辑到4列并简化了它,所以小错误可能是由于匆忙编辑造成的。真正的查询要大得多。

+0

以及更新标志你也想插入新用户?如果是的话,你在什么版本的SQL Server?希望2008年,所以你可以使用`merge`! – 2011-01-10 15:41:34

+0

是的,我想更新现有的条目并添加任何新条目。我正在使用SQL Server 2008. – Yeodave 2011-01-10 15:43:26

回答

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; 
相关问题