Sql server 为什么触发器中的更新失败?

Sql server 为什么触发器中的更新失败?,sql-server,Sql Server,关于触发器应该如何工作,这里有很多答案,但我想知道我的独特之处在于代码在insert上运行,而@type变量得到了错误的答案。如果将查询与表引用隔离运行,则返回正确的答案;只是作为触发的一部分,我得到了一个错误 查询的一部分调用了一个函数,但这一切都是在单独完成时工作的,所以我想知道我的触发器中是否有其他东西导致它失败,而我没有意识到 SQL: 因此,目前所有记录都会得到一种“更新类型失败”,即使它们满足要插入/更新的“有氧运动”标准 提前谢谢。 菲尔 还尝试了此更新: UPDATE mp

关于触发器应该如何工作,这里有很多答案,但我想知道我的独特之处在于代码在insert上运行,而@type变量得到了错误的答案。如果将查询与表引用隔离运行,则返回正确的答案;只是作为触发的一部分,我得到了一个错误

查询的一部分调用了一个函数,但这一切都是在单独完成时工作的,所以我想知道我的触发器中是否有其他东西导致它失败,而我没有意识到


SQL:

因此,目前所有记录都会得到一种“更新类型失败”,即使它们满足要插入/更新的“有氧运动”标准

提前谢谢。 菲尔


还尝试了此更新:

UPDATE  mph_print_test_queue
SET mph_print_test_queue.type = 'updated cardio'
FROM    
    inserted,test_group_requests tgreq (NOLOCK)
INNER JOIN
    test_form_requests tfreq (NOLOCK) ON tgreq.tgreq_refno = tfreq.tgreq_refno
INNER JOIN
    test_requests tereq (NOLOCK) ON tfreq.tfreq_refno = tereq.tfreq_refno
INNER JOIN
    test_definitions tstdf (NOLOCK) ON tereq.tstdf_refno = tstdf.tstdf_refno
INNER JOIN
    test_locations tstlc (NOLOCK) ON tstlc.tstdf_refno = tstdf.tstdf_refno
WHERE   
    tgreq.tgreq_refno = inserted.tgreq_refno
AND (tstlc.archv_flag = 'N' OR tstlc.archv_flag IS NULL)
AND tstlc.spont_refno IN
    (
    SELECT DISTINCT spont.spont_refno FROM service_points spont (NOLOCK) WHERE (spont.archv_flag = 'N' OR spont.archv_flag IS NULL) AND spont.code IN (SELECT Item FROM [dbo].[MPH_PARSELIST](@car_sponts))
    )

在回家的路上,我终于有了一个机会。不要将更新链接到插入的表,而只是根据匹配的记录进行批量更新


很抱歉,在发布之前没有收到此邮件。漫长的一天

第一个问题就在这里:“从插入中选择V_Refno=tgreq_Refno”。插入的集合可以包含多行。。。但是这个触发器假设只有一行。所有触发器应始终假定插入/删除可以有多行,并且可以处理集合,而不是标量。在更新时,V_Refno将只包含插入的最后一行的值,例如,如果更新了多行。@pmbAustin谢谢,我尝试了该更新的一百万种变体,知道问题在那里,但仍然没有乐趣。我之前尝试的批量更新也不起作用,那么什么是神奇的触摸?我将更新添加到了主线程的末尾。在继续将nolock提示散布到各处之前,您可能还想看看这一点。这远比许多人意识到的更险恶。在您的更新中,您真的应该使用ANSI-92样式的联接,它们已经存在25年了@谢谢你的提示。我有这个坏习惯,因为使用这个数据库的应用程序永远被锁定,我们不允许更改全局设置来进行补偿。仍然;这是一个我应该多加考虑的坏习惯。关于连接,查询尚未完成,但由于我自己在这个问题上的思维障碍,今天已更改了大约一百万次。再次感谢你的提示。
UPDATE  mph_print_test_queue
SET mph_print_test_queue.type = 'updated cardio'
FROM    
    inserted,test_group_requests tgreq (NOLOCK)
INNER JOIN
    test_form_requests tfreq (NOLOCK) ON tgreq.tgreq_refno = tfreq.tgreq_refno
INNER JOIN
    test_requests tereq (NOLOCK) ON tfreq.tfreq_refno = tereq.tfreq_refno
INNER JOIN
    test_definitions tstdf (NOLOCK) ON tereq.tstdf_refno = tstdf.tstdf_refno
INNER JOIN
    test_locations tstlc (NOLOCK) ON tstlc.tstdf_refno = tstdf.tstdf_refno
WHERE   
    tgreq.tgreq_refno = inserted.tgreq_refno
AND (tstlc.archv_flag = 'N' OR tstlc.archv_flag IS NULL)
AND tstlc.spont_refno IN
    (
    SELECT DISTINCT spont.spont_refno FROM service_points spont (NOLOCK) WHERE (spont.archv_flag = 'N' OR spont.archv_flag IS NULL) AND spont.code IN (SELECT Item FROM [dbo].[MPH_PARSELIST](@car_sponts))
    )