Sql server 是否基于表到表更新字段?

Sql server 是否基于表到表更新字段?,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,我正处于一种脑力激荡的状态。我想,让我们向极客们解释一下,这样他们可以帮助我解决这个问题 我在Oracle中有一个名为Sharepoint_Users的表。(见以下格式和数据)。我已经从链接服务器访问了oracle数据库。不用担心。只是考虑它是SQL表。< /P> SharePoint_Users ID Status 1 Active 2 InActive 3 Active 4 InActive

我正处于一种脑力激荡的状态。我想,让我们向极客们解释一下,这样他们可以帮助我解决这个问题

我在Oracle中有一个名为Sharepoint_Users的表。(见以下格式和数据)。我已经从链接服务器访问了oracle数据库。不用担心。只是考虑它是SQL表。< /P>
SharePoint_Users

ID         Status
1           Active
2           InActive
3           Active
4           InActive
在SQL server中还有两个名为aspnet_user和aspnet_UsersInRoles的表

aspnet_users
UserID                                       UserName      

A7DFDDAE-4DB8-476D-9C29-677763406F71          1
D9910E14-9206-4460-88CA-4C39DE620192          2
F188B1DF-03A6-4332-BA89-3B3C6682E9BA          3
728E77E7-693A-4015-92CA-02F0A403C29A          4

asnet_usersInRoles

UserID                                      RoleID

A7DFDDAE-4DB8-476D-9C29-677763406F71        1E36A840-2EBB-44EC-8861-0E3D262AC676 ----> InActive
D9910E14-9206-4460-88CA-4C39DE620192        0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA --->Active
现在是挑战

* When users status changes in SharePoint_Users table from 'Active' to 'InActive'
 OR 'InActive' to 'Active'. We need to update same users RoleID in 
 asnet_usersInRoles table.


* And also I need insert new records those not exists in asnet_usersInRoles 
  table but exists in aspnet_users table.
  If user not found in aspnet_users should not insert them into 
  asnet_usersInRoles.(always users will be the same SharePoint_Users 
  and aspnet_users)

请帮我写一个sp来完成它。我将每1小时运行一次此sp的作业以进行更新。

要在SharePoint\u用户发生更改时进行更新,我想您需要一个触发器,但您还写道,您将每1小时运行一次sp,以便

无论如何,这里有一个insert语句用于第二部分,一个update语句用于第一部分。由于您不知道更改了哪些行,更新将更新所有行

insert into asnet_usersInRoles(UserID, RoleID)
select
  UserID,
  case s.[Status] when 'Active'
    then '0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA'
    else '1E36A840-2EBB-44EC-8861-0E3D262AC676'
  end
from aspnet_users as au
  inner join (select ID, min([Status]) as [Status]
              from SharePoint_Users
              group by ID) as s
    on au.UserName = s.ID
where not exists (select *
                  from asnet_usersInRoles as uir
                  where au.UserID = uir.UserID)

update asnet_usersInRoles
set RoleID = case s.[Status] when 'Active'
               then '0B54F223-E0D4-4CFC-84C3-7C98C1BFC6DA'
               else '1E36A840-2EBB-44EC-8861-0E3D262AC676'
             end
from asnet_usersInRoles as uir
  inner join aspnet_users as u
    on uir.UserID = u.UserID
  inner join (select ID, min([Status]) as [Status]
              from SharePoint_Users
              group by ID) as s
    on u.UserName = s.ID  

当您希望在更新另一个表时修改表中的数据时,请使用触发器:

CREATE TRIGGER SharePoint_Users_Trg_Upd ON SharePoint_Users
AFTER UPDATE
AS
/* update statements here */
GO

这样你就不需要sp每小时都在听了。

书呆子,好吧,但是极客?你怎么敢,先生!;)我们不会删除问题,因为您希望更新它。请想一种不同的方式来做你想做的事情。在Oracle表上使用触发器更新SQL Server上的表会对性能产生什么影响?@James123。我相信你所追求的最新答案。新的guid表示活动和非活动?这是真的。新GUID仅表示活动和非活动。让我在本地机器上试试,然后在产品上申请。谢谢你们的帮助。米凯尔,我这里有个问题SharePoint_Use表有一些重复记录。大约有200个用户同时具有“活动”和“非活动”两种状态,我们可以在这里查询它们吗?@James123是的,如果您有办法决定使用哪种副本。例如,总是在非活动之前选择活动,或者如果有日期/时间戳列,则总是使用最新注册的。@Mikael,是的,我只想在“非活动”之前始终选择“活动”。没有日期和时间戳。你能找零钱吗?