您的語法只是一點點關閉。你在變量中有一個值,你不必爲了訪問而編寫一些表或別名。
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'
或類似的東西...
你能解釋一下你正在嘗試做什麼,以及上述不怎麼做?你是否試圖將存儲過程的輸出插入到tbl_Events表中?你是否知道即使從同一個語句中插入了多行,觸發器也會觸發一次? –
這與http://stackoverflow.com/questions/9241475/how-to-pass-procedure-output-to-multi-row-insert-statement有些相關,但不同之處在於應用程序邏輯僅限於單向函數,行插入在這種情況下,我試圖在觸發器代碼 – tpcolson