3

我正在尝试创建程序,该程序正在生成错误说明

表中标识列的显式值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 回答
1

试试这个——

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 dbo.tblRegisterUser (FirstName, LastName, Username, [Password], Designation, Department, IsAdmin)
    SELECT @FirstName, @LastName, @Username, @Password, @Designation, @Department, @IsAdmin

    DECLARE @ID BIGINT
    SELECT @ID = SCOPE_IDENTITY()

    --SET IDENTITY_INSERT dbo.tblLogin ON;

    INSERT INTO dbo.tblLogin (UserName, [password], [uid], IsAdmin)
    SELECT @Username, @Password, @ID, IsAdmin 
    FROM tblRegisterUser 
    WHERE UserName = @Username 
        AND [password] = @Password

    --SET IDENTITY_INSERT dbo.tblLogin OFF;

END
于 2013-06-10T08:57:35.157 回答