【问题标题】:Temporary table in stored procedure存储过程中的临时表
【发布时间】: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


【解决方案1】:

您可以将临时表创建为

创建表 #tmp_execute ( id int, 名称 varchar(50), ………… )

然后,执行动态查询

插入#tmp_execute 从 tbl_Sample 中选择 ....

如果您需要执行动态列,您可以使用带有条件语句的“alter table #tmp_execute add your_column int”。

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多