2011-07-27 59 views
0

我有一个表叫dbo.Tbl_ActivityInformations和数据看起来像插入行之前的SQL查询检查条件

Activityid activitymaxcount Activityusedcount 
    1    10     9 
    2    10     7 
    3    15    15 

而另一台名为Tbl_AttendeeInformations和数据看起来像

AttendedID AssID  ActivityID 
    13  123456  1,2 
    14  123457  1,3 

Tbl_AttendeeInformations表数据将作为新的一行从页面插入,并在ActivityInformationsActivityusedcount列中增加一个适当的activityID

现在我想在插入一行之前检查AttendeeInformationsActivityusedcount < activitymaxcount使用ActivityID。如果条件满足,那么只有它允许插入,否则它应该回滚。我有名为SplitString的功能将ActivityID分成Tbl_AttendeeInformations

这是SplitString

create FUNCTION dbo.SplitString(@FormattedString varchar(8000),@Delimitter char(1))  
returns @retResults TABLE(Value varchar(8000),Rownumber int)  
as  
BEGIN  
     DECLARE  @SearchString as varchar(8000)  
     DECLARE  @AssignString as varchar(8000)  
     DECLARE @Index int      
     DECLARE @Count int  

     set @SearchString = @FormattedString  
     set @AssignString= ''  
     set @Count = 0  

     while(len(@SearchString) > 0)  
     begin      
       SET @Index = CHARINDEX(@Delimitter,@SearchString, 0)      
       set @Count = @Count + 1  
       if @Index = 0  
       begin  
         INSERT INTO @retResults  
           values(@SearchString,@Count)  
         set @SearchString = ''  
         continue  
       end      
       set @AssignString = SUBSTRING(@SearchString,1, @Index - 1)  
       INSERT INTO @retResults values  
         (@AssignString,@Count)  

       SET @SearchString = (select SUBSTRING(@SearchString, @Index + 1, LEN(@SearchString) - @Index))  


     end  
     return  
END  

请你帮助的代码。

+2

你应该** **正常化你的表正确的 - 有'1,2'在一列明显违反连第一范式 - 这将使它即使是最基本的关系操作也很难做到...... –

+1

不满意我不能upvote @ marc_s的评论十次。打破第一范式的XX分隔的列值是可怕的;让他们在你的关键专栏是完全不能接受的。 (是的,我知道**你没有设计它,我知道**你不能改变它......但你必须在某处画一条线:) –

回答

0

伪代码显示了一个想法:

INSERT INTO AttendeeInformations 
SELECT act.* 
FROM ActivityInformations act 
INNER JOIN AttendeeInformations at ON act.ActivityID = at.ActivityID 
WHERE act.Activityusedcount < act.activitymaxcount 
+0

谢谢你的回复,但是在这里我们在参与者信息中获得组合(1,2)活动ID – Sree

+0

查看更新的答案,你可以自己决定选择哪个信息,使用act。*从ActivityInformations中选择所有/ smth特定 – sll

+0

是的,我已经看到,但activityId组合意味着,2)AttendeeInformations表和ActivityInformations不可分割。那么如何编写内部连接和外部分割 – Sree