我在使用stackoverflow中的搜索功能,但我找不到我的問題的答案。但我相信我不能成爲第一個遇到這個問題的人。SQL Server 2012插入多行後插入觸發器
在我的SQL Server 2012中,我插入了行,並且有一個插入後觸發器。插入的僞表格包含一行,其中包含一個時間戳。
使用我的函數,timestamp得到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
並將插入的表格僞裝成表格變量,則插入將成功執行。
我搜索了一段時間,它看起來像我需要一個遊標。這是正確的嗎。有替代品嗎?
你有什麼線索嗎?
謝謝 弗蘭克
===編輯
我應該解釋我在做什麼...... 獲得帶有狀態callrecords,讓說,「連接」,將CALL_ID和啓動時間戳和結束時間戳。 我必須報告持續時間。我用三個參數開始,結束和以分鐘爲單位的時間間隔寫了一個表值函數。
作爲結果集,我得到一個數據集每間隔一行。它包含一個interval_is(自1970年以來,我爲每個時間間隔創建一個唯一的ID)以及一個調用與某個時間間隔重疊的持續時間。
在源表中的insertet數據集:
---------------------------------------------------------------
| call_id | state | starttime | endtime |
---------------------------------------------------------------
| 4711 | 4 | 2013-10-31 09:25:12 | 2013-10-31 09:32:24 |
---------------------------------------------------------------
功能產生的follwing結果:
--------------------------
| interval_id | duration |
--------------------------
| 3991333 | 288 |
--------------------------
| 3991334 | 144 |
--------------------------
與交叉連接一試插入到目標表:
---------------------------------------------
| interval_id | state | call_id | duration |
---------------------------------------------
| 3991333 | 4 | 4711 | 288 |
---------------------------------------------
| 3991334 | 4 | 4711 | 144 |
---------------------------------------------
並且失敗。
「myFunction」結果集和「Inserted」僞表之間是否存在一個(或多個)公共列?我認爲你應該能夠在這裏使用簡單的連接(而不是'CROSS JOIN')......另外:'myFunction'到底是什麼? –
此外:你認爲這個陳述會選擇什麼你插入的表? 'SET @state_time =(從插入狀態中選擇state_time)'這真的是非常糟糕的代碼 - 'Inserted'可以包含**多行** - 哪一個'state_time'和'end_time'被選中? –
你說「*插入的僞表包含一行.. *」,但它不包含,它包含多行。這是導致你的'SET =(Select ..)'子查詢失敗的原因。 – RBarryYoung