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这个代码,这个想法和公认的答案确实很难闻。除非只是为了调试。