【问题标题】:SQL Server trigger to insert multiple rows with different row-setSQL Server 触发器插入具有不同行集的多行
【发布时间】:2017-09-28 12:29:16
【问题描述】:

如何使用 SQL Server 触发器将具有时间序列行的表转换为基于列的表?

Timeseries 源表variable_table:

---------------------------------------------------
timestamp    var             property        value
---------------------------------------------------
1506598200   A01_NetOrder    49              10.0
1506598200   A01_NetOrder    50               3.5
1506598200   A01_NetRec      49              20.0
1506598200   A01_NetRec      50               4.0
--------------------------------------------------

将在目标表中使用触发器插入多行。

目标表var_column_table:

---------------------------------------------------------
timestamp      loc       property    NetOrder     NetRec
---------------------------------------------------------
1506598200    A01        49          10.0         20.0
1506598200    A01        50           3.5          4.0
---------------------------------------------------------

触发解决方法

ALTER trigger [dbo].[rowColInsert]
ON [dbo].[variable_table]
AFTER INSERT 
AS
BEGIN
    SET NOCOUNT ON;

    declare @timestamp int
    declare @val varchar(125)
    declare @var varchar(125)
    declare @loc varchar(125)
    declare @col varchar(125)
    declare @cal int
    declare @sql varchar(max)

    select @timestamp = (select timestamp from inserted)
    select @var = (select var from inserted)
    select @property = (select property from inserted)
    select @value = (select value from inserted)

    select 

    select 
        @loc = (select left(@var, (select charindex('_', @var,0))-1))

    if exists (select timestamp from var_column_table where timestamp = @time)
    begin
        select @sql = 'update var_column_table set ' + @col + '=' + cast(@value as varchar)
        exec(@sql)
    end
    else
    begin
        select @sql = 'insert into var_column_table (timestamp, loc, property' + @col + ') values (' + cast(@timestamp as varchar) + ',' + cast(@loc as varchar) + ',' + cast(@property as varchar) + ','+ cast(@value as varchar) + ')'
        exec(@sql)
    end
 end

请建议解决方法以获得所需的结果。注意:插入的表有多条记录。

编辑

1) variable_table 中的 var 有多个前缀,例如:V01、V02、V03...

【问题讨论】:

    标签: sql-server stored-procedures triggers


    【解决方案1】:

    您需要在合并语句中访问插入的表。你的触发器:

         ALTER trigger [dbo].[rowColInsert]
            ON [dbo].[variable_table]
            AFTER INSERT 
            AS
            BEGIN
                SET NOCOUNT ON;
    
               MERGE var_column_table AS TARGET 
        USING
        (
        SELECT timestamp
        ,substring(var,0,charindex('_',var)) as loc
        , i1.property
        ,i1.value as NetOrder
        ,i2.value as NetRec
        FROM inserted i1 
        inner join inserted i2 on i1.timestamp = i2.timestamp and i1.property=i2.property
    WHERE i1.property like '%NetOrder%' AND i2.property like '%NetRec%'
        ) AS SOURCE (timestamp, loc, property, NetOrder, NetRec)
        ON TARGET.timestamp = SOURCE.timestamp AND TARGET.property = SOURCE.property
        WHEN MATCHED THEN UPDATE
        SET
        TARGET.NetOrder = SOURCE.NetOrder,
        TARGET.NetRec = SOURCE.NetRec 
        WHEN NOT MATCHED THEN INSERT (timestamp, loc, property, NetOrder, NetRec)
        VALUES (source.timestamp, source.loc, source.property, source.NetOrder, source.NetRec);
             end
    

    请测试它是否有效。基本上,“插入”表包含触发器触发时插入的所有行。您可以使用合并语句来执行 upsert 逻辑。

    【讨论】:

    • 工作正常。如果变量表中有 105 个变量怎么办。这样这些变量会在inner join和where子句中呈现?
    • 我在辅助表上测试了这个,说“variable_table1”代替插入的表,过程有你的代码,它工作正常,行插入到 var_column_table 但触发器没有插入。猜猜为什么?
    • 还添加了 where 子句中的 loc 相等性。 i1.loc = i2.loc.
    • 请检查触发器是否被触发。您可以通过将触发代码更改为插入 variable_table1 select * from inserted 来“记录”执行。如果你在 variable_table 中插入任何行,它们也应该在 variable_table1 中弹出
    • 触发器正在触发。确认:select TRG.name, ETS.last_execution_time from sys.dm_exec_trigger_stats AS ETS INNER JOIN sys.triggers AS TRG ON ETS.object_id = TRG.object_id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多