我在表中保留了所有更改(插入,更新,刪除)的觸發器。當我每次只插入一行時,它工作正常。但是當我試圖一次插入多行時,我收到此錯誤:SQL Server 2012觸發器:爲每一行執行動態sql
子查詢返回多個值。當 子查詢遵循=,!=,<,< =,>,> =或當子查詢用作 表達式時,這是不允許的。
這裏是觸發器的代碼(I除去不需要的縮短等變量聲明等代碼中的一些部件)
UPDATE:實際的錯誤是在這些線時#tempTrigT包含多行:
Select * into #tempTrigT from (select * from deleted where @Action in ('U','D')) A UNION (select * from inserted where @Action ='I')
set @sql = 'set @audit_oldvalue=(select cast([' [email protected] +'] as NVARCHAR(4000)) from #tempTrigT)';
EXEC SP_EXECUTESQL @sql,N'@audit_oldvalue sql_variant OUTPUT',@audit_oldvalue OUTPUT -- If inserted @audit_oldvalue gets the new value
set @sql = 'set @audit_value=(select cast(i.[' [email protected] +'] as NVARCHAR(4000)) from dbo.TForms i inner join #tempTrigT d on i.id = d.id)';
EXEC SP_EXECUTESQL @sql,N'@audit_value sql_variant OUTPUT',@audit_value OUTPUT
我該如何改變它以適用於多行?
所以..任何時候你得到這個錯誤,只要使用'='查找子查詢。你有兩個:'set @ audit_oldvalue =(從#tempTrigT)'和下面的'set'操作選擇cast(['+ @ Item +']作爲NVARCHAR(4000))。這兩個看起來像他們會拉我多重價值。 –
@AaronDietz,但我不應該收到這個錯誤...對不對? – aggicd
如果您使用'=(subquery)'並且該子查詢返回多個值,您將收到錯誤 –