在未正确执行的触发器中插入
Insert within a trigger not executing correctly
我有一个插入、更新触发器,我只是想将变量值插入 table。这是一个 field/variable
即 nchar(100)
:
DECLARE @Name nchar(100)
SET @Name = LEFT((select top 1 ISNULL(Name, '')
from inserted
inner join dbo.accounts on inserted.id = dbo.accounts.id_c), 25)
BEGIN TRY
INSERT INTO CRM.dbo.TestName (name) VALUES (@Name)
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH;
查看跟踪,我看到 TRY
的每一行都在执行(SP:StmtStarting
和 SP:StmtCompleted
),但是当我检查 table 本身时,什么都没有插入。
我如何确定发生这种情况的原因?
您可以在触发器中尝试以下语句。保留 TRY/CATCH
块,因为 SQL 服务器如果尝试使用零记录执行 INSERT INTO
将抛出异常。
BEGIN TRY
INSERT INTO [crm].[dbo].[TestName] ([Name])
SELECT LEFT(ISNULL([Name], ''), 25)
FROM [inserted]
INNER JOIN [dbo].[accounts]
ON ([dbo].[accounts].[id_c] = [inserted].[id]);
END TRY BEGIN CATCH
END CATCH;
您在什么触发器中使用它,例如 AFTER INSERT
、AFTER UPDATE
?如果您在 AFTER INSERT
中执行此操作,您能否期望 accounts
中的某些内容与 inserted.id
匹配。它似乎是一个主键,在插入记录之前可能不应该存在于 accounts
中。
我终于弄清楚我的触发器是如何失败的,但我不是 100% 知道原因。我有另一个插入语句到链接服务器 table 进一步低于触发器。 raiseerror 命令帮助我弄清楚了那个插入语句出了什么问题,在我修复了那个错误之后,我的问题中的插入语句成功执行了。
我不明白的是,即使明确地将插入放在 BEGIN TRAN/COMMIT TRAN 中,如果下一个插入不起作用,它仍然不会执行吗?这就是触发器的工作原理吗?
我有一个插入、更新触发器,我只是想将变量值插入 table。这是一个 field/variable
即 nchar(100)
:
DECLARE @Name nchar(100)
SET @Name = LEFT((select top 1 ISNULL(Name, '')
from inserted
inner join dbo.accounts on inserted.id = dbo.accounts.id_c), 25)
BEGIN TRY
INSERT INTO CRM.dbo.TestName (name) VALUES (@Name)
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH;
查看跟踪,我看到 TRY
的每一行都在执行(SP:StmtStarting
和 SP:StmtCompleted
),但是当我检查 table 本身时,什么都没有插入。
我如何确定发生这种情况的原因?
您可以在触发器中尝试以下语句。保留 TRY/CATCH
块,因为 SQL 服务器如果尝试使用零记录执行 INSERT INTO
将抛出异常。
BEGIN TRY
INSERT INTO [crm].[dbo].[TestName] ([Name])
SELECT LEFT(ISNULL([Name], ''), 25)
FROM [inserted]
INNER JOIN [dbo].[accounts]
ON ([dbo].[accounts].[id_c] = [inserted].[id]);
END TRY BEGIN CATCH
END CATCH;
您在什么触发器中使用它,例如 AFTER INSERT
、AFTER UPDATE
?如果您在 AFTER INSERT
中执行此操作,您能否期望 accounts
中的某些内容与 inserted.id
匹配。它似乎是一个主键,在插入记录之前可能不应该存在于 accounts
中。
我终于弄清楚我的触发器是如何失败的,但我不是 100% 知道原因。我有另一个插入语句到链接服务器 table 进一步低于触发器。 raiseerror 命令帮助我弄清楚了那个插入语句出了什么问题,在我修复了那个错误之后,我的问题中的插入语句成功执行了。
我不明白的是,即使明确地将插入放在 BEGIN TRAN/COMMIT TRAN 中,如果下一个插入不起作用,它仍然不会执行吗?这就是触发器的工作原理吗?