先给 Name 加上唯一索引
BEGIN TRY
    insert into tba(id,Name) values(@@IDENTITY,@name)
END TRY
BEGIN CATCH
    --SQL Server 会在索引(内存)中检查唯一约束,产生的重复错误忽略掉
END CATCH
select @id = Id from tba where Name=@name

解决方案 »

  1.   

    上面的 @@IDENTITY 不要,我把它看成 IDENTITY() 了,
      

  2.   

    1、前台程序可这样处理,报错后仍往下执行
        如:vb程序的:
       on error resume next
       sSQL="insert into tba(Name) values(@name)"
       .....
    2、后台可以这样处理:--不用加事务
    insert into tba(name) SELECT '123' WHERE NOT EXISTS(SELECT * FROM  tba WHERE [Name]='123')
      

  3.   

    先给 Name 加上唯一索引
     
    BEGIN TRY
        insert into tba(id,Name) values(@@IDENTITY,@name)
    END TRY
    BEGIN CATCH
        --SQL Server 会在索引(内存)中检查唯一约束,产生的重复错误忽略掉
    END CATCH
    select @id = Id from tba where Name=@name
    这个开始不要判断 是否存在? 如果存在则返回一个 ID 出去
      

  4.   

    唯一索引会检查是否存在,存在则报错。
    插入不成功,取的是存在记录的ID。
    插入成功了,取的是新加记录的ID。
    总之保证这个name有且仅有一个ID。
      

  5.   

    我的建议是建一个中间表,中间表不做任何约束,5台机器直接往中间表插数据,然后用一个job在每天凌晨的时候对中间表中的数据进行迁移,迁移的时候可以做判断,这样的话就比较快