2016-11-15 104 views
1

我需要在触发器中创建和使用带有GROUP BY子句的临时表,但我在这样做时遇到了困难。使用GROUP BY在TRIGGER中创建临时表

我尝试:

在这里,我试图使用这些触发后下降了两个临时表到达结束。

首先我创建一个#Temptable和触发器。

CREATE TABLE #TempTable (admID smallint, diagID smallint); 

CREATE TRIGGER tr_newTest 
ON Adm_Diag 
FOR INSERT 
AS 
BEGIN 
... 
END 

由于插入的表格只包含当前INSERTUPDATE声明我路过几个INSERTUPDATE语句#TempTable行。

DECLARE @admID smallint 
SELECT @admID = Adm_ID 
FROM inserted 

DECLARE @diagID smallint 
SELECT @diagID=Diag_ID 
FROM inserted 

INSERT INTO #TempTable VALUES (@admID, @diagID) 

现在有了这个数据,我想创建一个临时表组#TempTable行:

SELECT * 
INTO #TempGroupTable 
FROM 
(
    SELECT admID, COUNT(*) as Diag 
    FROM #TempTable 
    GROUP BY admID 
) t1 
WHERE Diag > 2 

整个脚本

CREATE TABLE #TempTable (admID smallint, diagID smallint); 

CREATE TRIGGER tr_newTest 
ON Adm_Diag 
FOR INSERT 
AS 
BEGIN 

    DECLARE @admID smallint 
    SELECT @admID = Adm_ID 
    FROM inserted 

    DECLARE @diagID smallint 
    SELECT @diagID=Diag_ID 
    FROM inserted 

    INSERT INTO #TempTable VALUES (@admID, @diagID) 

    -- Below I'm tring to create #TempGroupTable 

    SELECT * 
    INTO #TempGroupTable 
    FROM 
    (
     SELECT admID, COUNT(*) as Diag 
     FROM #TempTable 
     GROUP BY admID 
    ) t1 
    WHERE Diag > 2 

END 

执行触发器后,我得到一个错误:

Msg 208, Level 16, State 0, Line 41 Invalid object name '#TempGroupTable'.

如何创建#TempGroupTable

+0

为什么不使用物理表而不是临时表。使用'#'的临时表不能在会话之外工作。 – Esty

+0

@TanjimRahman我不需要在会话之外使用临时表。正如我所说,只是在触发期间。 – Jazz

+0

使用双磅符号,'## TempGroupTable' – Rene

回答

2

不能确定你正在尝试做什么,而是以##开头的全局临时表为你工作?那么把#TempGroupTable改成##TempGroupTable

0

为什么不放弃临时表和变量的所有开销?尝试:

CREATE TRIGGER tr_newTest 
ON Adm_Diag 
INSTEAD OF INSERT 
AS 
BEGIN 

INSERT INTO Adm_Diag (adminID, Diag) 
SELECT admID, COUNT(*) as Diag 
FROM inserted 
GROUP BY admID 

END