使用 GROUP BY 在 TRIGGER 中创建临时表
Posted
技术标签:
【中文标题】使用 GROUP BY 在 TRIGGER 中创建临时表【英文标题】:Creating a temporary table within a TRIGGER with GROUP BY 【发布时间】:2016-11-15 05:09:32 【问题描述】:我需要在触发器中创建和使用带有GROUP BY
子句的临时表,但这样做有困难。
我的尝试:
这里我尝试使用两个临时表,它们在触发器结束后被删除。
首先我创建一个#Temptable
和触发器。
CREATE TABLE #TempTable (admID smallint, diagID smallint);
CREATE TRIGGER tr_newTest
ON Adm_Diag
FOR INSERT
AS
BEGIN
...
END
由于插入的表仅包含当前INSERT
和UPDATE
语句的行,我将几个INSERT
和UPDATE
语句传递给#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
执行触发器后出现错误:
消息 208,级别 16,状态 0,第 41 行无效的对象名称 '#TempGroupTable'。
如何创建#TempGroupTable
?
【问题讨论】:
你为什么不使用物理表而不是临时表。带有#
的临时表在会话之外无法工作。
@TanjimRahman 我不需要在会话之外使用临时表。正如我所说,仅在触发期间。
使用双井号,##TempGroupTable
当您的触发器工作时,它不会获得单个 #
临时表。正如@Rene 所说,您要么使用物理表,要么使用##
。
@Jazz 这段代码,这个想法和接受的答案确实很糟糕。除非只是为了调试目的。
【参考方案1】:
不确定您要做什么,但以##
开头的全局临时表是否适合您?那么将#TempGroupTable
改成##TempGroupTable
?
【讨论】:
【参考方案2】:为什么不免除临时表和变量的所有开销?试试:
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
【讨论】:
以上是关于使用 GROUP BY 在 TRIGGER 中创建临时表的主要内容,如果未能解决你的问题,请参考以下文章
SQL:在 GROUP BY 中使用 SELECT 中的别名
使用 group by 汇总列并存储为 MySQL 中的新列(永久)