插入多行时,SQL Server 2012 AFTER INSERT触发器

时间:2013-10-31 16:42:37

标签: sql triggers insert sql-server-2012

我在stackoverflow中使用搜索功能,但我无法找到问题的答案。但我确信我不能成为第一个遇到这个问题的人。

在我的SQL Server 2012中,我正在插入行,我有一个后插入触发器。插入的伪表包含一行,尤其是时间戳。

使用我的函数,时间戳会产生1到x行之间的数据集,每四分之一小时在行上。通过交叉连接,我有一个多行数据集试图插入目标表。

要记住:
在源表中插入一行后,我触发了触发器。插入的表包含一行。我尝试在目标表中插入多行。

错误讯息:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

代码

  -- Insert statements for trigger here
DECLARE @state_time DATETIME,@end_time DATETIME
SET @state_time =
    (SELECT state_time from inserted)
SET @end_time =
    (SELECT end_time from inserted)

BEGIN TRY

       INSERT INTO t_Duration
          SELECT
    i.interval
    ,t1.call_id
    ,t1.agent_id
    ,t1.service_id
    ,t1.state
    ,i.duration
         FROM
             (SELECT * 
              FROM myFUnction(@state_time, @end_time, 15)) AS i -- here i get more than one row
         CROSS JOIN 
             (SELECT * from inserted) AS t1
END TRY
BEGIN CATCH
END CATCH

为什么呢?是否无法使用触发器插入多行?如果我复制INSERT INTO并使用表变量伪造插入的表,则插入执行成功。

我搜索了一下,看起来我需要一个光标。这是正确的吗。还有其他选择吗?

你对我有什么线索吗?

谢谢 弗兰克

=== edit

我应该解释一下我在做什么...... 我得到一个状态的callrecords,让我们说“connect”,call_id和一个开始时间戳和endtimestamp。 我必须报告持续时间。我写了一个表值函数,其中包含三个参数start,end和间隔的持续时间,以分钟为单位。

作为结果集,我得到一个每个区间有一行的数据集。它包含一个interval_is(我自1970年以来每个区间都有一个唯一的id)和一个呼叫重叠一个区间的持续时间。

源表中的insertet数据集:

---------------------------------------------------------------
| call_id | state | starttime           | endtime             |
---------------------------------------------------------------
| 4711    | 4     | 2013-10-31 09:25:12 | 2013-10-31 09:32:24 |
---------------------------------------------------------------

该函数产生以下结果:

--------------------------
| interval_id | duration |
--------------------------
| 3991333     | 288      |
--------------------------
| 3991334     | 144      |
--------------------------

使用交叉连接尝试插入目标表:

---------------------------------------------
| interval_id | state | call_id | duration  |
---------------------------------------------
| 3991333     | 4     | 4711    | 288       |
---------------------------------------------
| 3991334     | 4     | 4711    | 144       |
---------------------------------------------

它失败了。

1 个答案:

答案 0 :(得分:0)

我已经不舒服地回答我自己的问题了,我收到了很多有用的评论,这些评论让我走上正轨。

向所有向我写过关于这个问题的人致歉。

问题在于设置vraibeles而不是插入....

所以我在以下代码中更改了交叉连接。

    INSERT INTO t_Duration
    SELECT 
        t.interval
        ,t.call_id
        ,t.agent_id
        ,t.service_id
        ,t.state
        ,t.duration
    FROM (
        SELECT 
            *
        FROM
            inserted AS i
        CROSS APPLY (
        SELECT 
            *
        FROM 
            fInterval2(i.state_time,i.end_time,15) AS iid
        ) AS ext
    ) AS t

完美无缺。 谢谢你 弗兰克