EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发

网络编程 2025-03-13 14:48www.168986.cn编程入门

近期,在MS SQL领域,我们面临着一系列挑战。项目要求我们在动态环境中处理存储过程、触发器和表函数,因为我们的程序设计允许用户根据需求动态地添加或删除表的字段。随着表字段从最初的十个增长到现在的三百个,甚至可能更多,之前的静态处理方式已经无法满足需求。Insus.NET的任务就是将这些静态的处理方式全部转为动态处理。

这两个表是动态存在于内存中的,而不是存储在数据库中,因此无法直接访问。触发器的执行是在触发它的SQL操作执行计划中进行的。当我们使用EXEC(EXECUTE)或sp_executesql执行动态生成的SQL语句时,它们会形成一个单独的执行计划,无法和触发器的执行计划共享资源。而且,当执行计划完成后,内存中的资源也会被释放。

为了解决这个问题,Insus.NET想到了使用临时表的方法。我们可以将INSERTED或DELETED表中的数据转移到临时表中,然后对临时表的数据进行处理。例如,我们可以使用如下代码将INSERTED和DELETED表中的数据转移到临时表:

```sql

SELECT INTO inserted FROM INSERTED

SELECT INTO deleted FROM DELETED

```

然后,我们可以使用动态生成的SQL语句来操作这些临时表。例如:

```sql

DECLARE @F NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX),@I) --@I动态字段

EXECUTE ('SELECT ['+ @F +'] FROM deleted')

```

通过这种方式,我们可以绕过对INSERTED和DELETED直接操作的限制,实现对动态字段的处理。虽然这不是最优雅的方式,但在当前的需求和限制下,这是一个可行的解决方案。我们将会继续更优的解决方案,以提供更好的用户体验和更高的效率。这个问题困扰了我们整个周末,但现在我们已经找到了一个解决方案,我们会继续努力,确保项目的顺利进行。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by