1

従業員、連絡先、ログインの 3 つのテーブルがあります。従業員テーブルには、ID 値を持つ主キーとして emp_id があります。Contact テーブルには、Employee テーブルの emp_id を参照する外部キーとして emp_id があり、Login テーブルにも、Employee テーブルの emp_id を参照する外部キーとして emp_id があります。すべてのテーブルには、すべてが identity(1,1) として設定されているため、自動的に増加する主キーがあります。

これが私のSQLクエリです:

create procedure [dbo].[sp_registerEmp] 
@start_date datetime,
@first_name varchar(50),
@middle_name varchar(50),
@last_name varchar(50),
@father_name varchar(50),   
@grandfather_name varchar(50),
@country varchar(20),
@mobile_no int,
@email_id varchar(30),
@designation varchar(30),
@username varchar(20),
@password varchar(15),
@security_question varchar(150),
@security_answer varchar(50)


as
begin

    begin try
        begin transaction

            insert into [dbo].[Employee]([start_date])
            values(@start_date)

            insert into [dbo].[Contact](first_name,middle_name,last_name,father_name,grandfather_name,
                                        country,mobile_no,email_id,emp_id)
            values(@first_name,@middle_name,@last_name,@father_name,@grandfather_name,
                    @country,@mobile_no,@email_id,SCOPE_IDENTITY());


            insert into [dbo].[Login](username,userpassword,security_question,security_answer,emp_id)
            values(@username,@password,@security_question,@security_answer,IDENT_CURRENT('Employee'));

        commit transaction
    end try

    begin catch

        rollback transaction

    end catch

end

ここで私の質問は、ident_current('tablename') がセッションとスコープに関係なく、そのテーブルで生成された最後の ID 値を返すことです。あるユーザー向けであるが、別のユーザー向けに作成されたテーブル。トランザクションの最初のクエリによって挿入されるログイン テーブルの emp_id を取得したいだけです。これを達成するにはどうすればよいですか?

もう1つの問題は、Visual Studioからストアドプロシージャを実行すると、エラーがあるにもかかわらず、失敗と成功に関係なく、挿入試行のたびに主キーが増加する. エラーが発生したときに、主キーが増加しないようなことをしたい.私はこれを行う必要がありますか?

4

1 に答える 1

1

トランザクションの最初のクエリによって挿入される emp_id ... が欲しいだけです。どうすればこれを達成できますか?

の結果を格納するローカル変数を宣言するだけですSCOPE_IDENTITY()。次に、この変数を後続のステートメントで使用できます。

...
begin transaction
declare @emp_id int

insert into [dbo].[Employee]([start_date])
values(@start_date)

-- store for later use    
set @emp_id = SCOPE_IDENTITY()

insert into [dbo].[Contact](first_name,middle_name,last_name,father_name,grandfather_name,
                            country,mobile_no,email_id,emp_id)
values(@first_name,@middle_name,@last_name,@father_name,@grandfather_name,
        @country,@mobile_no,@email_id, @emp_id );
--- here ----------------------------> ^^^^^^^

insert into [dbo].[Login](username,userpassword,security_question,security_answer,emp_id)
values(@username,@password,@security_question,@security_answer, @emp_id );
--- here -----------------------------------------------------> ^^^^^^^

...

エラーが発生したとき、主キーが増えない、などをしたいのですが、どうすればよいですか?

これを行う簡単な方法はないと思います-各エラーの後にID値を再シードする必要があります:

DBCC CHECKIDENT (<table_name>, RESEED)

これはエラーが発生しやすいと思います (すべてのエラーで上記を呼び出すつもりですか?)、良い考えではありません。MSDN のDBCC CHECKIDENTも参照してください。

于 2013-05-27T00:53:03.327 に答える