我有一个insert,update触发器,我只是想将变量值插入表中。这是一个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
),但是当我检查表本身时,没有插入任何内容。
我如何确定发生这种情况的原因?
答案 0 :(得分:0)
您可以在触发器中尝试以下语句。保留TRY/CATCH
阻止,因为如果SQL Server尝试执行没有记录的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
可能不应该存在。
答案 1 :(得分:0)
我终于弄明白我的触发器是如何失败的,但我不是100%的原因。我在触发器的下方有另一个插入语句到链接服务器表。 raiseerror命令帮我弄清楚插入语句出了什么问题,在我修复了那个错误之后,我的问题中的insert语句成功执行了。
我没有得到的是,即使明确地将插入放在BEGIN TRAN / COMMIT TRAN中,如果下一个插入不起作用,它仍然不会执行?这就是触发器的工作原理吗?