2012-06-09 50 views
0

我試圖將過程的輸出傳遞給觸發體。以下是我對我認爲可能是一個非常簡單的答案的嘗試。謝謝!傳遞過程輸出參數到觸發體

INSTEAD OF INSERT 
AS BEGIN 
SET NOCOUNT ON; 

DECLARE @id INT, @num_ids INT; 
EXEC [dbo].[i14_get_ids] 2, 1, @id OUTPUT, @num_ids OUTPUT; 
INSERT dbo.tbl_Events(
Event_ID, Location_ID, Event_Group_ID, 
Protocol_Name, Start_Date, 
ObjectID 
) 
SELECT 
a.Event_ID, a.Location_ID, a.Event_Group_ID, 
a.Protocol_Name, a.Start_Date, 
b.ObjectID 
From 
(SELECT 
Event_ID, Location_ID, Event_Group_ID, 
Protocol_Name, Start_Date 
--deosn't work  
--ObjectID as @id 

    --********************************** 
FROM inserted) AS a 
--doesn't work 
    @id ; 

end 
+0

你能解釋一下你正在嘗試做什麼,以及上述不怎麼做?你是否試圖將存儲過程的輸出插入到tbl_Events表中?你是否知道即使從同一個語句中插入了多行,觸發器也會觸發一次? –

+0

這與http://stackoverflow.com/questions/9241475/how-to-pass-procedure-output-to-multi-row-insert-statement有些相關,但不同之處在於應用程序邏輯僅限於單向函數,行插入在這種情況下,我試圖在觸發器代碼 – tpcolson

回答

3

您的語法只是一點點關閉。你在變量中有一個值,你不必爲了訪問而編寫一些表或別名。

ALTER TRIGGER dbo.Name_Of_Trigger_You_Left_Out 
ON dbo.Name_Of_Table_You_Left_Out 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @id INT, @num_ids INT; 

    EXEC [dbo].[i14_get_ids] 2, 1, @id OUTPUT, @num_ids OUTPUT; 

    INSERT dbo.tbl_Events 
    (
     Event_ID, Location_ID, Event_Group_ID, 
     Protocol_Name, Start_Date, ObjectID 
    ) 
    SELECT 
     Event_ID, Location_ID, Event_Group_ID, 
     Protocol_Name, Start_Date, ObjectID = @id 
    FROM inserted; 
END 
GO 

ObjectID =別名是沒有必要的,我只是想很明顯和明確的,它是一個變量出現。你有ObjectID as @id - 這是倒退,你說「用別名@id展示列ObjectID - 你真正的意思是@id AS ObjectID - 但在這種情況下,它只是一個包含在選擇列表中的值,沒有嚴格的需要在這裏提供別名。

如果您要依靠此處理只處理單行插入,您應該考慮在觸發器內通過檢查inserted中的行數來執行該操作,然後再繼續。僅僅因爲應用程序邏輯是有限的,並不意味着這個觸發器不會觸發在應用程序邏輯控制之外發生的插入,或者在應用程序邏輯中永遠不會出現錯誤。

編輯

完全繞過邏輯,如果請求的應用程序是由它的連接字符串爲「我的酷應用程序」確定:

ALTER TRIGGER dbo.Name_Of_Trigger_You_Left_Out 
ON dbo.Name_Of_Table_You_Left_Out 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF NOT EXISTS 
    (
    SELECT 1 FROM sys.dm_exec_sessions 
    WHERE session_id = @@SPID 
    AND program_name = 'My Cool Application' 
) 
    BEGIN 
    DECLARE @id INT, @num_ids INT; 

    EXEC [dbo].[i14_get_ids] 2, 1, @id OUTPUT, @num_ids OUTPUT; 

    INSERT dbo.tbl_Events 
    (
     Event_ID, Location_ID, Event_Group_ID, 
     Protocol_Name, Start_Date, ObjectID 
    ) 
    SELECT 
     Event_ID, Location_ID, Event_Group_ID, 
     Protocol_Name, Start_Date, ObjectID = @id 
    FROM inserted; 
    END 
END 
GO 

或者如果它是由一個登錄標識你可以只檢查IF SUSER_SNAME() <> 'MyMultiRowLogin'或類似的東西...

+0

中使用@id有趣但真實。只有一個「可以」執行多行插入的應用程序,它使用全局登錄。任何機會,我可以禁用這個觸發器,如果​​它只是這個應用程序執行插入? – tpcolson