SQL : can't get IDENTITY value in Trigger
I am newbie in SQL.I am creating a dummy project.In my project, I have one register page and I want to create a UserName(FirstName + LastName + UserID).But the problem is, I cant catch the UserID value.I have used both After Trigger and Instead Of Trigeer. Below is my script -
Table -
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)
)
Proc of Insert Data -
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
After Trigger -
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
Output - Inserted two rows
Instead Of Trigger -
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
Output - this works fine but Identity is 0.
Please tell me how I can do this?
Thanks in advance.
You have problems
- Why do you have a stored proc and INSTEAD OF? Use either a stored proc OR an instead of trigger: not both
- Second, the triggers are coded for one row only
- The after trigger is inserting a new row, should be an update
As to why:
The stored proc has no INSERT to trap the IDENTITY value: the scope for the INSERT is actually the instead of trigger. If you switch to @@IDENTITY (bad practice) you'd get the IDENTITY value from the AFTER trigger.
What to do:
Drop both of the triggers: they add no value
Either add a computed column to the table if UserName cannot be changed
eg
ALTER TABLE UserInfo ADD UserName AS FirstName+LastName+Cast(UserID AS NVARCHAR(100)
- ...or add an UPDATE to the stored proc UserName could be changed later
eg
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
Try this trigger:
CREATE TRIGGER Create_UserName
ON UserInfo
AFTER INSERT
AS
BEGIN
--DECLARE @_UName VARCHAR(500), @user_id INT
--SELECT @_UName = FirstName + LastName + Cast(UserID AS NVARCHAR(100)), @user_id = UserId FROM INSERTED
UPDATE UserInfo
SET UserName = i.FirstName + i.LastName + Cast(i.UserID AS NVARCHAR(100))
FROM UserInfo u
INNER JOIN Inserted I ON (i.UserId = u.UserId)
--WHERE UserId = @user_id
END
If you have SQL-Server 2005+ you can use the output clause of the insertstatement.
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
DECLARE @OV Table (id int);
INSERT INTO UserInfo (FirstName,LastName,[Password],EmailID,[Address],CountryID,StateID)
inserted.id into @OV
VALUES (@FirstName,@LastName,@Password,@EmailID,@Address,@CountryID,@StateID)
SELECT @UserID = id FROM @OV;
update UserInfo set UserName = FirstName + LastName + Cast(UserID AS NVARCHAR) where UserID = @userid
END
EDIT: Missing keyword added, update of UserName column
精彩评论