我在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 |
---------------------------------------------
它失败了。
答案 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
完美无缺。 谢谢你 弗兰克