我想问为什么(尝试捕获)不能正常工作,因为什么时候出现错误2触发器显示问题。不要问桌子和桌子2之间的不同这只是表示问题的例子。
CREATE TRIGGER Example
ON Person
after INSERT
AS
BEGIN TRY
INSERT INTO [Person2]
SELECT
inserted.Name,
inserted.Surname,
inserted.Age,
inserted.Street
FROM inserted
END TRY
BEGIN CATCH
END CATCH
如果触发延迟,则插入工作正确
INSERT INTO Person
Values
('Jhon', 'Kowalsky', '12', null)
错误
(0行(s)受影响)
消息3616,级别16,状态1,行1在触发期间出现错误 执行。批处理已中止,用户事务处理如果 任何,已被回滚。
表人 - 在这里你可以看到人与人之间的一个区别2街道允许空值
表人员2 - 在这里你可以看到人与人之间的一个区别2街道不允许空值
答案 0 :(得分:1)
试试这个 -
CREATE TRIGGER dbo.Example
ON dbo.Person
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
DECLARE @OwnTran BIT
SET @OwnTran = 0
IF @@TRANCOUNT = 0
BEGIN
SET @OwnTran = 1
BEGIN TRAN
END
BEGIN TRY
INSERT INTO dbo.Person2 (Name, Surname, Age, Street)
SELECT
i.Name
, i.Surname
, i.Age
, i.Street
FROM INSERTED i
END TRY
BEGIN CATCH
DECLARE @em NVARCHAR(MAX), @sev INT, @st INT
SELECT @em = ERROR_MESSAGE(),
@sev = ERROR_SEVERITY(),
@st = ERROR_STATE()
RAISERROR(@em, @sev, @st)
IF @@TRANCOUNT > 0
ROLLBACK TRAN
END CATCH
IF @OwnTran = 1 AND @@TRANCOUNT > 0
BEGIN
COMMIT TRAN
END
END