SQL:无法在Trigger中获取IDENTITY值

Moh*_*ar 1 sql sql-server triggers

我是SQL的新手.我正在创建一个虚拟项目.在我的项目中,我有一个注册页面,我想创建一个UserName(FirstName + LastName + UserID).但问题是,我无法捕获UserID值.我使用了触发后和替代Trigeer.以下是我的脚本 -

表 -

CREATE TABLE UserInfo
(
    UserID INT IDENTITY(1,1),
    FirstName NVARCHAR(500),
    LastName NVARCHAR(500),
    [Password] NVARCHAR(200),
    EmailID NVARCHAR(200),
    [Address] NVARCHAR(500),
    CountryID INT,
    StateID INT,
    UserName NVARCHAR(500)
)
Run Code Online (Sandbox Code Playgroud)

插入数据的过程 -

CREATE PROC Create_User    
 @FirstName NVARCHAR(500),    
 @LastName NVARCHAR(500),    
 @Password NVARCHAR(200),    
 @EmailID NVARCHAR(200),    
 @Address NVARCHAR(500),    
 @CountryID INT,    
 @StateID INT,    
 @UserID INT OUTPUT    
AS    
 BEGIN    
 INSERT INTO UserInfo (FirstName,LastName,[Password],EmailID,[Address],CountryID,StateID)    
 VALUES    
 (@FirstName,@LastName,@Password,@EmailID,@Address,@CountryID,@StateID)    

 SET @UserID = SCOPE_IDENTITY();    

 END 
Run Code Online (Sandbox Code Playgroud)

触发后 -

CREATE TRIGGER Create_UserName
ON UserInfo
AFTER INSERT
AS
BEGIN
DECLARE @_UName VARCHAR(200);
SET @_UName = (SELECT FirstName+LastName+Cast(UserID AS NVARCHAR(100)) from INSERTED )

INSERT INTO UserInfo (UserName) VALUES (@_UName)
END
    GO
Run Code Online (Sandbox Code Playgroud)

输出 - 插入两行

而不是触发 -

CREATE TRIGGER Create_UserName
ON UserInfo
INSTEAD OF INSERT
AS
BEGIN
DECLARE @UName NVARCHAR(200);
DECLARE @FName NVARCHAR(200);
DECLARE @LName NVARCHAR(200);
DECLARE @UPassword NVARCHAR(200);
DECLARE @UEmailID NVARCHAR(200);
DECLARE @UAddress NVARCHAR(200);
DECLARE @UCountryID INT;
DECLARE @UStateID INT;
SET @UName = (SELECT FirstName+LastName+Cast(UserID AS NVARCHAR(100)) from INSERTED )
SET @FName = (SELECT FirstName from INSERTED )
SET @LName = (SELECT LastName from INSERTED )
SET @UPassword = (SELECT [Password] from INSERTED )
SET @UEmailID = (SELECT EmailID from INSERTED )
SET @UAddress = (SELECT [Address] from INSERTED )
SET @UCountryID = (SELECT CountryID from INSERTED )
SET @UStateID = (SELECT StateID from INSERTED )




INSERT INTO UserInfo (FirstName,LastName,[Password],EmailID,[Address],CountryID,StateID,UserName)  
VALUES (@FName,@LName,@UPassword,@UEmailID,@UAddress,@UCountryID,@UStateID,@UName)
END
    GO
Run Code Online (Sandbox Code Playgroud)

输出 - 这工作正常,但身份是0.

请告诉我怎么做?

提前致谢.

gbn*_*gbn 5

你有问题

  • 为什么你有一个存储过程和INSTEAD OF?使用存储过程OR或而不是触发器:不是两者
  • 其次,触发器仅编码为一行
  • after触发器是插入一个新行,应该是更新

至于为什么:

存储过程没有INSERT来捕获IDENTITY值:INSERT的范围实际上是而不是触发器.如果切换到@@ IDENTITY(不良练习),您将从AFTER触发器获得IDENTITY值.

该怎么办:

  • 删除两个触发器:它们不添加任何值

  • 如果无法更改UserName,请将计算列添加到表中

例如

ALTER TABLE UserInfo ADD UserName AS FirstName+LastName+Cast(UserID AS NVARCHAR(100)
Run Code Online (Sandbox Code Playgroud)
  • ...或者向存储的proc UserName添加UPDATE可以在以后更改

例如

CREATE PROC Create_User    
...
AS    

SET NOCOUNT, XACT_ABORT ON

BEGIN TRY
 BEGIN TRAN

 INSERT INTO UserInfo
   (FirstName,LastName,[Password],EmailID,[Address],CountryID,StateID)    
 VALUES    
   (@FirstName,@LastName,@Password,@EmailID,@Address,@CountryID,@StateID)

 SET @UserID = SCOPE_IDENTITY();    

 UPDATE UserInfo
 SET UserName = @FirstName+@LastName+Cast@UserID AS NVARCHAR(100)
 WHERE UserID = @UserID

   COMMIT TRAN
END TRY
BEGIN CATCH
   IF XACT_STATE() <> 0 ROLLBACK TRAN
END CATCH
GO
Run Code Online (Sandbox Code Playgroud)