Sql server 使用GROUP BY在触发器内创建临时表

Sql server 使用GROUP BY在触发器内创建临时表,sql-server,tsql,database-trigger,Sql Server,Tsql,Database Trigger,我需要在触发器中创建并使用带有GROUPBY子句的临时表,但这样做有困难 我的尝试: 在这里,我尝试使用两个临时表,它们在触发器结束后被丢弃 首先,我创建了一个#attreable和触发器 CREATE TABLE #TempTable (admID smallint, diagID smallint); CREATE TRIGGER tr_newTest ON Adm_Diag FOR INSERT AS BEGIN ... END 由于插入的表只包含当前INSERT和UPDATE语句的行

我需要在触发器中创建并使用带有
GROUPBY
子句的临时表,但这样做有困难

我的尝试:

在这里,我尝试使用两个临时表,它们在触发器结束后被丢弃

首先,我创建了一个
#attreable
和触发器

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

CREATE TRIGGER tr_newTest
ON Adm_Diag
FOR INSERT
AS
BEGIN
...
END
由于插入的表只包含当前
INSERT
UPDATE
语句的行,因此我将几个
INSERT
UPDATE
语句传递给
#tentable

DECLARE @admID smallint
SELECT @admID = Adm_ID
FROM inserted

DECLARE @diagID smallint
SELECT @diagID=Diag_ID
FROM inserted

INSERT INTO #TempTable VALUES (@admID, @diagID)
现在,利用这些数据,我想创建一个临时表,对
#tentable
的行进行分组:

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,16级,状态0,第41行无效对象名称 “#临时分组表”


如何创建
#TempGroupTable

不确定您想做什么,但以
#
开头的全局临时表是否适合您?因此,将
#TempGroupTable
转换为
#TempGroupTable

为什么不省去temp表和变量的所有开销?尝试:

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

为什么不使用物理表而不是临时表呢。带有
#
的临时表在会话之外无法工作。@TanjimRahman我不需要在会话之外使用临时表。正如我所说,仅在触发器的持续时间内。使用双磅符号,
#TempGroupTable
当触发器工作时,它不会得到单个
#
临时表。要么使用物理表,要么像@Rene说的那样使用
##
。@Jazz这个代码,这个想法和公认的答案确实很难闻。除非只是为了调试。