gpt4 book ai didi

SQL : can't get IDENTITY value in Trigger

转载 作者:行者123 更新时间:2023-12-05 00:10:04 27 4
gpt4 key购买 nike

我是 SQL 新手。我正在创建一个虚拟项目。在我的项目中,我有一个注册页面,我想创建一个用户名(名字 + 姓氏 + 用户 ID)。但问题是,我无法捕获用户 ID value.我已经使用了After Trigger和Instead Of 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)
)

插入数据过程 -

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

触发后 -

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

输出 - 插入两行

代替触发器 -

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

输出 - 这工作正常,但身份为 0。

请告诉我该怎么做?

提前致谢。

最佳答案

你有问题

  • 为什么你有一个存储过程而不是?使用存储过程或替代触发器:不能同时使用
  • 其次,触发器仅针对一行进行编码
  • 后触发器正在插入新行,应该是更新

至于原因:

存储过程没有 INSERT 来捕获 IDENTITY 值:INSERT 的范围实际上是代替触发器。如果您切换到@@IDENTITY(不好的做法),您将从 AFTER 触发器中获取 IDENTITY 值。

要做什么:

  • 删除这两个触发器:它们不会增加任何值(value)

  • 如果用户名无法更改,则向表中添加计算列

例如

ALTER TABLE UserInfo ADD UserName AS FirstName+LastName+Cast(UserID AS NVARCHAR(100)
  • ...或者向存储过程添加更新,用户名稍后可以更改

例如

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

关于SQL : can't get IDENTITY value in Trigger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4457837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com