CREATE PROCEDURE [dbo].[sp_RemoteAddEmployee] @dvcID bigint,@EmpID varchar(10),@Name varchar(10),@Company varchar(50),
@Post varchar(10),@PhoneNum varchar(15),@IdentityCard varchar(20),
@Note varchar(50),@Type tinyint,@FpData1 varbinary(512),
@FpData2 varbinary(512),@FpData4 varbinary(512),@PhotoData image,
@ErrorCode int output,@FpNo int output

AS
DECLARE @strSQL varchar(1024)
DECLARE @FingerNo int

set @FpNo = -1

BEGIN TRAN
–select TOP 20 FpNo = IDENTITY(int,1,1) into #t from syscolumns a

–生成指纹号码
select @FingerNo = CASE WHEN NOT EXISTS(select  * from bEmployee_Inf where FingerSn = 1 and dvcID = @dvcID) THEN 1
    ELSE
    (
select MIN(FingerSn) + 1 from bEmployee_Inf a where NOT EXISTS(select * from bEmployee_Inf where FingerSn = a.FingerSn + 1) and dvcID = @dvcID
    )
    END

if exists(select ID from bEmployee_Inf where dvcID = @dvcID and IdentityCard = @IdentityCard)
begin
set @ErrorCode = 1
COMMIT TRAN
return
end

–set @index = 1

–Create Table #bFpNo from (select
insert into bEmployee_Inf (dvcID,EmpID,Name,Company,Post,PhoneNum,IdentityCard,Note,Type,FpData1,FpData2,FpData4,PhotoData,FingerSn) values
(@dvcID,@EmpID,@Name,@Company,@Post,@PhoneNum,@IdentityCard,@Note,@Type,@FpData1,@FpData2,@FpData4,@PhotoData,@FingerNo)
if @@ERROR <> 0 or @@ROWCOUNT = 0
begin
set @ErrorCode = 2;
ROLLBACK
return
end
COMMIT TRAN

set @ErrorCode = 0
set @FpNo = @FingerNo
GO

请问一下 这样的存储过程能保证 @FpNo 在同时操作的时候能保证是唯一的吗?就是不会同时产生相同的FpNo.
还有那个IdentitCard 在插入一条新纪录的时候能保证它的唯一性吗?

都不能保证唯一.
最好用字段来限制一下,例如主键设成FingerSn

那要怎样来保证呢?

主要有2种方法:
1. 使用generator,create generator是串行的,可以保证每次生成的ID是唯一的。不过不是所有的DBMS都支持。
2. 使用随机生成的序列号,检测碰撞,如果出现冲突再重新生成一个。

不是事务本身就有加锁的功能吗?

难道可以同时执行同一个事务?

顶一把,问题还是没人来解答啊

数据库本身的功能,比如事务等等,才能实现