2013-06-04 35 views
0

它,我有一个名为任务,ProjectTeamMemeber,等级和分配四个表。
每个任务与通过一个层次结构项目和每个项目都有团队成员可通过ProjectTeamMember看到。值复制到另一个表,如果它不已经存在

select 
    TH.TaskId As TaskID, P.PersonId As PersonID  
from 
    Task T 
    Inner join Hierarchy TH on T.Id = TH.TaskId 
    Inner join ProjectTeamMemeber PTM on TH.ProjectId = P.TaskId 
where 
    T.name = 'work' 

上述查询返回分配给特定项目中,任务名称为“工作”

TaskId  PersonId 
1347  50 
1350  50 
3377  50 
3403  598 
3411  1450 
3411  1454 
3411  1472 

的所有的人,我有另一个表分配新建分配FY从中我可以看到人的ID,该ID被分配给一个特定的任务。

select 
    T.Id, A.PersonId 
from 
    Task T 
    inner join Assignment A ON T.Id = A.TaskId 
where 
    T.name = 'work' 

以上查询返回分配给任务的所有人称为'工作'。现在

TaskId  PersonId 
1347  50 
1350  50 
3411  1472 

,我要在这里实现的是分配所有人员与被分配到其中有一个任务名称“工作”项目名称“工作”的任务。简单地说,我必须编写一些sql语句,在此之后,我的第二个查询与第一个查询的结果相同。

到目前为止,我曾尝试与cusrsors要做到这一点,但它是行不通的。下面是该

DECLARE @TaskId int 
DECLARE @PersonId int 
DECLARE @Id int 

DECLARE db_cursor CURSOR FOR 
select 
    TH.TaskId As TaskID, P.PersonId As PersonID  
from 
    Task T 
    Inner join Hierarchy TH on T.Id = TH.TaskId 
    Inner join ProjectTeamMemeber PTM on TH.ProjectId = P.TaskId 
where 
    T.name = 'work' 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TaskId, @PersonId 
BEGIN 
    If not exists (select 1 from Assignment where [email protected] and [email protected]) 
    BEGIN 
     EXEC GetUniqueIdentifier @Id OUTPUT; 
     Insert INTO Assignment (Id, TaskId, PersonId) values (@Id, @TaskId, @PersonId) 
    END 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 

注意代码:我必须使用EXEC声明@Id GetUniqueIdentifier输出;来生成ID我知道有可能不同,更可靠的方式来生成的ID,但由于一些限制我不能改变是如何被生成的ID)

编辑:

基于LAMAK答案我跑这

DECLARE @ids int 
INSERT INTO Assignment (Id, TaskId, PersonId) 
EXEC GetUniqueIdentifier @ids OUTPUT; 
SELECT 
    @ids, 
    TH.TaskId As TaskID, 
    P.PersonId As PersonID, 
FROM 
    Task T 
    INNER JOIN Hierarchy TH on T.Id = TH.TaskId 
    INNER JOIN ProjectTeamMember P on TH.ProjectId = P.TaskId 
WHERE 
    T.name = 'Customer work' 
    AND NOT EXISTS(SELECT 1 FROM Assignment 
       WHERE TaskID = TH.TaskId 
       AND PersonId = P.PersonId) 

回答

2

你不需要为这个CURSOR,您可以使用一组基础的解决方案:

INSERT INTO Assignment (Id, TaskId, PersonId) 
SELECT 
    NEWID(), 
    TH.TaskId As TaskID, 
    P.PersonId As PersonID  
FROM 
    Task T 
    INNER JOIN Hierarchy TH on T.Id = TH.TaskId 
    INNER JOIN ProjectTeamMemeber PTM on TH.ProjectId = P.TaskId 
WHERE 
    T.name = 'work' 
    AND NOT EXISTS(SELECT 1 FROM Assignment 
        WHERE TaskID = T.TaskId 
        AND PersonId = P.PersonId) 

关于NEWID(),你真的需要检查collitions?我认为是安全的假设NEWID()如果运行在同一台机器上将是唯一的。即使在不同的服务器上,重复值的可能性也非常小。

修订

好了,所以,你不需要一个UNIQUEIDENTIFIER,你使用GetUniqueIdentifier SP(也严重名字,因为UNIQUEIDENTIFIER是一种数据类型,至极能带来混乱)。然后我很害怕你需要使用CURSOR。在大多数情况下,你的光标似乎罚款,唯一可见的变化是,你是不是取了光标的下一个值:

DECLARE @TaskId int 
DECLARE @PersonId int 
DECLARE @Id int 

DECLARE db_cursor CURSOR FOR 
select 
    TH.TaskId As TaskID, P.PersonId As PersonID  
from 
    Task T 
    Inner join Hierarchy TH on T.Id = TH.TaskId 
    Inner join ProjectTeamMemeber PTM on TH.ProjectId = P.TaskId 
where 
    T.name = 'work' 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TaskId, @PersonId 
BEGIN 
    If not exists (select 1 from Assignment where [email protected] and [email protected]) 
    BEGIN 
     EXEC GetUniqueIdentifier @Id OUTPUT; 
     Insert INTO Assignment (Id, TaskId, PersonId) 
     values (@Id, @TaskId, @PersonId) 
    END 
    FETCH NEXT FROM db_cursor INTO @TaskId, @PersonId 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

你migth是对有关newid的,但我必须这样做的方式如上所述使用GetUniqueIdentifier过程 – LivingThing

+0

请参阅我编辑的问题 – LivingThing

+0

@LivingThing *叹* GetUniqueIdentifier返回什么?,您可以发布代码吗? – Lamak

相关问题