【发布时间】:2014-12-22 23:07:26
【问题描述】:
我有一个执行各种动态 sql 语句的存储过程。 实际上,这个存储过程将使用各种参数从 SSIS 触发。 所以会有很多并行执行。
此存储过程在执行期间使用临时表。
我使用Select .. into 语句手动创建表并将它们放在最后。
在并行执行期间,由于执行 2 试图创建或使用与执行 1 相同的临时表,因此进程最终出错。这会出错..
我尝试使用表变量来解决这个问题。但是,这在动态 SQL 中不起作用。 (How to use table variable in a dynamic sql statement?)
我尝试使用本地临时表解决此问题。然而,使用本地临时表的 SSIS 和存储过程并不是很好的结合。到目前为止,我还没有找到一个好的工作解决方案。http://consultingblogs.emc.com/jamiethomson/archive/2006/12/20/SSIS_3A00_-Using-stored-procedures-inside-an-OLE-DB-Source-component.aspx
我知道如何使用 GUID 的名称创建临时表。然后使用它使其在存储过程执行中是唯一的。但是,这确实会使我的动态 SQL 代码更难维护。
有没有人看到其他选项或者我让事情变得过于复杂?有没有更可行的解决方案?
【问题讨论】:
-
将这些创建为本地临时还是全局临时? stackoverflow.com/questions/892351/… 如果全局,本地可能会更好。并行执行是否发生在同一个会话中?如果是这样,那么关闭和打开不同的会话应该可以解决这个问题(但要付出时间)。是否也在使用连接池? (可能没有正确地导致会话在释放时不会终止,因此会出现问题。)
-
普通(本地)临时表已经在其名称中使用了 SPID GUID,因此不需要这样的东西。他们也不应该这样,所以我必须假设您正在使用全局临时表,答案是,正如 xQbert 已经建议的那样,只需使用本地临时表。
-
抱歉忘了提及以下内容:带有临时表的 SSIS 和 SP 真的很烦人! consultingblogs.emc.com/jamiethomson/archive/2006/12/20/…(更新了我的第一篇文章)
-
你想用 SSIS 完成什么,以使本地临时表不起作用?您是否尝试在独立连接的任务之间共享信息?
-
我不建议生成动态表名。相反,创建一个包含 ProcesId 的临时表。每个进程都可以使用这个共享表,并在完成后清除自己的记录。如果需要,您可以在 TempDB 中创建此表,您只需要确保 SSIS 包在不存在时可以重新创建它。
标签: sql sql-server tsql stored-procedures temp-tables