2017-08-21 10 views
0

SQLトリガを使用して変数テーブルを更新する方法はありますか?SQL Serverトリガ - 変数テーブル名

複数の異なるポイント番号で更新されたの読み取り値というテーブルが1つあります。このポイント番号を読み取り、特定のテーブルを更新するトリガーがあります。

私は以下のトリガーが動作しますが、テーブル名はです。Z01私は挿入されたデータに応じて変数になりたいと思います。これは可能ですか?

CREATE TRIGGER [dbo].[TRG_InsertTest] 
ON [dbo].[readings] 
AFTER INSERT AS 
BEGIN 
INSERT INTO Z01 
SELECT * FROM INSERTED 
END 
+0

私はトリガーが、彼らはあなたのデータベースのバックグラウンドで実行する前にダウンしてコンパイルする必要があるため、これは可能であるかわかりません。 –

+2

これは通常、壊れたデータモデルの兆候です。つまり、一般的に扱いたい同一の構造を持つ複数のテーブルがあることです。通常、* data *としてモデル化されるべきもののいくつかは*メタデータ*としてモデル化されています。私。より一般的なデータモデルでは、 'Z01'は、このデータのすべてを含むべき単一のテーブルの(あるカラムの)データとして現れるはずです。 –

+0

問題は、1秒ごとに読み取り値を取得する複数のセンサーがあるため、1つの表にそれらを結合したくないということです。そうしないと、表が大きくなりすぎる可能性があります。 **読み**テーブルは、特定の条件が満たされたときにのみ散発的に更新されます。私は条件がどこにあるのかというと複数のトリガーを持つという解決策を見出しましたが、それが最善の方法であるかどうかはわかりません。 – mkb

答えて

1

ここでは、トリガ内で動的SQLをテストするためのいくつかの簡単なスニペットを示します。それは動作するように見えます!

-- create the tables 
create table Readings 
(
    id  int identity, 
    tbl  varchar(10), 
    some_val int 
) 

create table Z01 
(
    id  int identity, 
    some_val int 
) 

create table Z02 
(
    id  int identity, 
    some_val int 
) 
go 

-- create the insert trigger 
CREATE TRIGGER [dbo].[TRG_InsertTest] 
ON [dbo].[Readings] 
AFTER INSERT AS 
BEGIN 
    declare @sql nvarchar(max) 

    select @sql = isnull(@sql, '') 
      + N'INSERT INTO ' + quotename(tbl) + ' (some_val) VALUES (' + convert(varchar(10), some_val) + ');' 
    from inserted 

    exec sp_executesql @sql 
END 

GO 

-- some testing data 
insert into Readings (tbl, some_val) 
select 'Z01', 10 union all 
select 'Z01', 11 union all 
select 'Z02', 20 

select * 
from Readings 

select * 
from Z01 

select * 
from Z02 
+0

完璧に、ありがとう! – mkb

0

あなたはこのように行うことができます -

CREATE TRIGGER [dbo].[TRG_InsertTest] 
    ON [dbo].[readings] 
    AFTER INSERT AS 
    BEGIN 
    DECLARE @a varchar(50) 
    DECLARE @b int 
    DECLARE @c datetime 
    DECLARE @d varchar(20) 

    SET NOCOUNT ON 

    select @a = a FROM INSERTED 
    select @b= b FROM INSERTED 
    select @c = c FROM INSERTED 
    select @d = d FROM INSERTED 

    If(@a = some condition and @b = some condition) 
    begin 
    INSERT INTO Z01 
    SELECT * FROM INSERTED 
    end 

    Else If(@a = some condition and @c = some condition) 
    begin 
    INSERT INTO Z02 
    SELECT * FROM INSERTED 
    end 

    Else If(@b = some condition and @d = some condition) 
    begin 
    INSERT INTO Z03 
    SELECT * FROM INSERTED 
    end 

    Else 
    begin 
    INSERT INTO Z04 
    SELECT * FROM INSERTED 
    end 
    END 
関連する問題