我在表中保留了所有更改(插入,更新,删除)的触发器。当我每次只插入一行时,它工作正常。但是当我试图一次插入多行时,我收到此错误: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)'并且该子查询返回多个值,您将收到错误 –