0

我在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并使用表变量伪造插入的表,则插入执行成功。

我搜索了一段时间,看起来我需要一个光标。这是正确的吗。有替代品吗?

你对我有线索吗?

谢谢弗兰克

=== 编辑

我应该解释一下我在做什么......我得到了带有状态的通话记录,比如说“连接”、call_id、开始时间戳和结束时间戳。我必须报告持续时间。我编写了一个表值函数,其中包含三个参数 start、end 和间隔的持续时间(以分钟为单位)。

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

源表中的插入数据集:

---------------------------------------------------------------
| 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       |
---------------------------------------------

它失败了。

4

1 回答 1

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

完美无缺。非常感谢弗兰克

于 2013-10-31T19:23:46.693 回答