SQL在触发器中使用临时表

Bas*_*eeb 1 sql sql-server triggers hashtable sql-server-2008-r2

我在MSSQL Server 2008R2中有一个触发器:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trg_HosFile_Delete] 
    ON [dbo].[hosfile] FOR DELETE 
AS 
    insert into #pys(pyGuid)
    SELECT EntryGuid AS pyGuid FROM er000 AS er

    insert into t2(C1) select pyGuid from #pys
Run Code Online (Sandbox Code Playgroud)

触发器执行后,t2表为空。为什么它是空的?

如果我在没有触发器的情况下执行以上查询,则t2表将被填充。

在触发器中使用临时表有什么问题吗?

Ale*_*xei 5

Damien的答案是正确的:您可以在触发器中使用临时表,但强烈建议在其中使用临时表,因为触发器可以在各种情况下触发。

如果在触发器中使用临时表,请检查临时表是否存在,因为您无法控制上下文,并且它可能已经存在:

IF OBJECT_ID('tempdb..#pys') IS NOT NULL
    DROP TABLE #pys
Run Code Online (Sandbox Code Playgroud)

另外,可以动态创建临时表:

SELECT * INTO #tmp
FROM inserted
Run Code Online (Sandbox Code Playgroud)

当触发器包含需要访问在动态SQL范围中不可见的插入或删除的特殊表的动态SQL时,此功能特别有用。

避免使用## tmp(全局临时变量),因为它们是全局可见的,并且在触发多个SPID时可能导致麻烦。