2017-02-15 28 views
1

すべてのレコード挿入に対してユーザーが作成した一意のIDを渡したプロシージャを実装しました。しかし、同時に複数のヒットが発生すると、すべてのユーザーに一意のIDが割り当てられてしまうという問題があります。ストアドプロシージャを使用してSQL Serverテーブルに重複レコードが挿入される

マイプロシージャのコードは、私が固有のIDがテーブルに見つからなくなるまで重複データを確認したい

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 

です。 これは、プロシージャで再帰を使用することを意味します。

また、私は一意性のためにスカラー値関数のCTEを使用しましたが、うまく機能しません。助けてください

+0

SQLのバージョンは何サーバーはこれですか? – laylarenee

+0

'image'データ型は、将来のバージョンのSQL Serverで削除されます。新しい開発作業でこのデータ型を使用しないようにし、現在使用しているアプリケーションを変更する予定です。代わりに '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

関連する問題