2017-02-15 94 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

相關問題