在我的ERP数据库中的表上触发代码

时间:2010-03-23 19:14:03

标签: tsql sql-server-2000

我的ERP供应商在桌面上有以下触发器:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[SOItem_DeleteCheck]
ON [dbo].[soitem]
FOR DELETE
AS 
BEGIN
    DECLARE @RecCnt int, @LogInfo varchar(256)

    SET @RecCnt = (SELECT COUNT(*) FROM deleted)

    IF @RecCnt > 150
    BEGIN
        RAISERROR (54010, 18, 1, 'SOItem') WITH LOG
        ROLLBACK TRANSACTION
    END

    SET @LogInfo = 'Deleting ' + LTRIM(STR(@RecCnt)) + ' Rows From SOItem'

    EXEC LogDeletes @LogInfo
END
GO

这对我来说似乎效率很低。不选择count(*)需要比Count(特定字段)更长的时间吗?

2 个答案:

答案 0 :(得分:1)

老实说,即使速度较慢,我也可以在不到一毫秒的时间内在我最大的表上运行一个类似的选择,这个表有数百万行,这个触发器不太可能触及。改变它没有真正的性能提升。我很好奇你为什么要回滚超过150条记录的任何交易。

答案 1 :(得分:1)

我认为在过去,计数(1)与计数(*)有一个好处,我们都被教导使用这种方法,但在这一点上,它更多的是关于风格而不是表现。