2013-10-31 44 views
0

我在使用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  | 
--------------------------------------------- 

並且失敗。

+0

「myFunction」結果集和「Inserted」僞表之間是否存在一個(或多個)公共列?我認爲你應該能夠在這裏使用簡單的連接(而不是'CROSS JOIN')......另外:'myFunction'到底是什麼? –

+1

此外:你認爲這個陳述會選擇什麼你插入的表? 'SET @state_time =(從插入狀態中選擇state_time)'這真的是非常糟糕的代碼 - 'Inserted'可以包含**多行** - 哪一個'state_time'和'end_time'被選中? –

+0

你說「*插入的僞表包含一行.. *」,但它不包含,它包含多行。這是導致你的'SET =(Select ..)'子查詢失敗的原因。 – RBarryYoung

回答

0

我已經很難回答我自己的問題,我收到了很多有用的意見,這些意見使我走上了正軌。

向所有向我發送有關此問題的人道歉。

問題是vraibeles的設置,而不是INSERT INTO ....

所以我改變了下面的代碼交叉聯接。

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 

工作完美。 謝謝 Frank