3

プロシージャを作成しようとしていますが、エラーが発生しています

table の ID 列の明示的な値はtblRegisterUser、列リストが使用されている場合にのみ指定できますIDENTITY_INSERT is ON

挿入ステートメントを , で囲もうとしましINDENTITY_INSERT to ONたが、それも機能しません。何か不足していますか、それとも含めたサブクエリのエラーですか?

以下はストアドプロシージャです

CREATE PROCEDURE dbo.spInsertUserRegister
(
    @FirstName nvarchar(50),
    @LastName nvarchar(50),
    @Username nvarchar(50),
    @Password nvarchar(50),
    @Designation nvarchar(50),
    @Department nvarchar(50),
    @IsAdmin bit
)
AS
BEGIN
    INSERT INTO tblRegisterUser Values
    (
        @FirstName, @LastName, @Username, @Password,@Designation,@Department,@IsAdmin
    )
    DECLARE @UID INT
    SET @UID = @@IDENTITY
    INSERT INTO tblLogin(Username,Password,UID,IsAdmin) 
    Values(@Username, @Password, @UID,(SELECT IsAdmin FROM tblRegisterUser WHERE     Username=@Username AND Password=@Password))
END
4

2 に答える 2

2

テーブルの構造tblRegisterUserが次のような場合

ID int primary_key autoincrement
FirstName varchar
LastName varchar 
Username varchar
Password varchar
Designation varchar
Department varchar
IsAdmin bit

このステートメントよりも間違っています:

INSERT INTO tblRegisterUser Values
(
    @FirstName, @LastName, @Username, @Password, 
    @Designation,@Department,@IsAdmin
)

列を指定するには、明示的な列リストを使用する必要があります。

INSERT INTO tblRegisterUser 
(  FirstName, LastName, Username, Password,
   Designation, Department, IsAdmin) 
VALUES 
(
    @FirstName, @LastName, @Username, @Password, 
    @Designation,@Department,@IsAdmin
)

このようにして、ID フィールドが自動的に入力され、@@Identityステートメントはそれを正しく返すはずです。


とはいえ、SQL Serverには、最後の行に対して生成された ID を返す関数がいくつかあり、それぞれに固有の長所と短所があります。

基本的:

  • @@IDENTITYトリガーを使用しない場合に機能します
  • SCOPE_IDENTITY()明示的に呼び出したコードに対して機能します。
  • IDENT_CURRENT(‘tablename’)すべてのスコープにわたって、特定のテーブルに対して機能します。

ほとんどすべてのシナリオSCOPE_IDENTITY()で必要なものであり、他のオプションとは対照的に、これを使用するのは良い習慣です。
アプローチの長所と短所に関する良い議論もここで入手できます。

この回答からコピー

于 2013-06-10T09:08:22.843 に答える