ALTER PROC SP_Friends
(
   @send_id       int,
   @receive_id    int,
   @rtn           int=0 output
)
as
  begin
      declare @sql nvarchar(2000)
      declare @flag int
      
      select @sql = 'select @rtn=count(*), @flag=flag from Friends where (send_user_id=@send_id and receive_user_id=@receive_id) or (send_user_id=@receive_id and receive_user_id=@send_id) group by send_user_id, flag'
      
      exec sp_executesql @sql, N'@rtn int output, @flag int, @send_id int, @receive_id int', @rtn output, @flag, @send_id, @receive_id
      
      if (@rtn > 0)
         
         begin 
           if @flag = 0
              set @rtn = 1
           set @rtn = 2
         end
      ---如果没有这两个人成为朋友的记录         
      if (@rtn <= 0)
         begin
           exec('insert into Friends (send_user_id, receive_user_id) values (' + @send_id + ', ' + @receive_id + ')')
         end
      if @@error > 0
    
         rollback tran
  end
请问这个存储过程哪里有问题,我插入相同的数据,总是可以插入,请问为什么?

解决方案 »

  1.   

    我实现的问题就是网站内添加其它用户为好友 表的结构就是 send_user_id  receive_user_id  flag  add_time
     ---------------------------------------------
          1               2           0      ....
          1               3           0      ....
          2               6           0      ....这样的格式
      

  2.   

    非常谢谢topest0302, 不设主键是不是就不能得到count(*)的值啊?我把add_time设成主键啦,把时间设成主键列,不影响什么吧,这个表基本都是int型的
      

  3.   

    count(*)和设不设主键没关系的
    设哪个字段或者哪几个字段为主键取决于你觉得这张表哪个或者哪几个字段是唯一的(比如,一张学生表,学生的学号可以是主键,学生名字可以重复但是学号必须唯一)