2017-02-15 74 views
1

我已经实现了一个过程,我为每个记录插入传递了用户自制的唯一ID。但问题是,同时出现多个匹配时,将唯一标识分配给所有用户。使用存储过程插入到SQL Server表中的重复记录

我的程序代码是

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER procedure [dbo].[name] 
    (
    [email protected]_id int, 
    @name nvarchar(50),  
    @designation int, 
    @deptmntid int, 
    [email protected] int, 
    @disid int, 
    @bentype_id int, 
    @benificry_type nvarchar(50), 
    @dob datetime, 
    @basic_pay int, 
    @home_address nvarchar(200), 
    @mobile nvarchar(50), 
    @email nvarchar(50), 
    @aadhar nvarchar(50), 
    @applicant_image image, 
    @ip nvarchar(50), 
    @udate datetime, 
    @ddoid int, 
    @depend_id int, 
    @relation int, 
    @flag int, 
    @officename nvarchar(max), 
    @deptother nvarchar(max), 
    @desigother nvarchar(max), 
    @regno bigint output, 
    @flg int output) 
AS 
    SET NOCOUNT ON; 

    DECLARE @regnc char(6); 
    DECLARE @numm varchar(7); 
    DECLARE @regnc_dcd varchar(11); 
    DECLARE @final_appno varchar(11); 
    DECLARE @bentype int; 
    DECLARE @ddotocode int; 
    DECLARE @ddochk int; 
    DECLARE @regidchk bigint; 

    BEGIN TRANSACTION 

     SELECT @ddochk = ddoid 
     FROM tablename 
     WHERE ddoid = @ddoid; 

     IF (@ddochk IS NULL) 
     BEGIN 
      SET @numm = '1'; 
      SET @regnc = STUFF(@numm, 1, 0, REPLICATE('0', 6 - LEN(@numm))); 
      SET @regnc_dcd = cast(@ddoid as varchar(4)) + cast(@bentype_id as varchar(1)) + cast(@regnc as varchar(6)); 
      SET @final_appno = @regnc_dcd 
     END 
     ELSE 
     BEGIN 
      SELECT 
       @numm = MAX(ISNULL(auto_inc, 0) + 1), 
       @ddotocode = ddoid 
      FROM 
       tablename 
      WHERE 
       ddoid = @ddoid; 

      SET @regnc = STUFF(@numm, 1, 0, REPLICATE('0', 6 - LEN(@numm))); 
      SET @regnc_dcd=cast(@ddotocode as varchar(4)) + cast(@bentype_id as varchar(1)) + cast(@regnc as varchar(6)); 
      SET @final_appno = @regnc_dcd 
     END 

     BEGIN 
      INSERT INTO tablename (reg_id, auto_inc, name, desigid, deptid, distid, bentype_id, benificry_type, dob, basic_pay, home_address, mobile, email, aadhar, ip, udate, ddoid, applicant_image, flag, officename, deptother, desigother) 
      VALUES (@final_appno, @regnc, @name, @designation, @deptmntid, @disid, @bentype_id, @benificry_type, @dob, @basic_pay, @home_address, @mobile, @email, @aadhar, @ip, @udate, @ddoid, @applicant_image, @flag, @officename, @deptother, @desigother) 

      SET @regno = @final_appno; 
     END 

     IF @@ERROR <> 0 
     BEGIN 
      ROLLBACK 
      -- Raise an error and return 
      RAISERROR ('Error in Inserting record from temp.....', 16, 1) 
      RETURN 
     END 

     BEGIN 
      INSERT INTO SHCbeneficiary(card_id, depend_id, pic, name, dob, relation, ip, aadhar, udate) 
      VALUES (@final_appno, @depend_id, @applicant_image, @name, @dob, @relation, @ip, @aadhar, @udate) 

      IF @@ERROR <> 0 
      BEGIN 
       -- Rollback the transaction 
       ROLLBACK 

       -- Raise an error and return 
       RAISERROR ('Error in updating record in persoaldetails....!!!', 16, 1) 
       RETURN 
      END 

      SET @flg = 1; 
     END 

     COMMIT TRANSACTION 

我要检查重复的数据,直到一个唯一的ID没有在表中找到。 这意味着我想在过程中使用递归。

此外,我已经使用了一个CTE,标量值函数的唯一性,但它运行不正常。请帮助

+0

什么版本的SQL服务器是这个吗? – laylarenee

+0

将在未来的SQL Server版本中删除'image'数据类型。避免在新的开发工作中使用这种数据类型,并计划修改当前使用它的应用程序。改用'varbinary(max)'。 [在此处查看详细信息](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

+0

为什么不只是使用IDENTITY列? – RBarryYoung

回答

0

如果您使用的是SQL Server 2012或更新版本,则可以使用SEQUENCES这一新的用户定义对象来生成一系列数字。例如:

CREATE SEQUENCE dbo.MySequence 
    AS int 
    START WITH 1 
    INCREMENT BY 1; 

可以检索与查询的顺序值,就像这样:

SELECT NEXT VALUE FOR dbo.MySequence AS [Value]; 

下面是详细信息技术文章:

https://technet.microsoft.com/en-us/library/ff878058(v=sql.110).aspx

相关问题