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を使用しましたが、うまく機能しません。助けてください
SQLのバージョンは何サーバーはこれですか? – laylarenee
'image'データ型は、将来のバージョンのSQL Serverで削除されます。新しい開発作業でこのデータ型を使用しないようにし、現在使用しているアプリケーションを変更する予定です。代わりに 'varbinary(max)'を使用してください。 [詳細はこちら](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –
なぜIDENTITY列を使用しないのですか? – RBarryYoung