我在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 |
---------------------------------------------
它失败了。