2016-11-15 3 views
1

トリガー内でGROUP BY句のテンポラリテーブルを作成して使用する必要がありますが、これは困難です。トリガー内のGROUP BYで一時テーブルを作成する

私の試み:

ここで私はトリガが最後に到達した後に廃棄された2つの一時テーブルを使用しようとしています。

まず、#Temptableとトリガーを作成します。

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

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

のみ挿入テーブルは、私が#TempTableにいくつかのINSERTUPDATE文を渡している現在のINSERTUPDATE文の行が含まれているため。

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

なぜ、テンポラリテーブルの代わりに物理テーブルを使用していませんか。 '# 'のTempテーブルはセッションの外では動作しません。 – 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