Sql server中的动态全局临时表

时间:2014-12-11 06:34:05

标签: sql sql-server

我有一个创建全局临时表的过程。问题是当你同时使用多个用户提出问题因为我在开始时取消我的临时表,是否有一个帮助我如何根据会话创建一个全局临时表。

1 个答案:

答案 0 :(得分:1)

  1. 如果你真的想要一个“每个会话”表,那么名称必须是不同的(因为它们的名称是全局的),所以使用动态sql生成任意名称,可能基于spid :

    declare @sql nvarchar(max)
    select @sql = N'select * into tempdb..##TempStudentRegistration' + convert(nvarchar(10), @@spid) + ' from Students'
    exec sp_executesql @sql
    
  2. (注意:单独使用Spid会假设全局临时表的生命周期与spid相同,并且调用者不会重用间谍;可以根据您的特定需要添加尽可能多的额外唯一性)。

    1. 相反,如果您想要一个全局表,但只需要支持多个会话写入它,那么考虑重新创建全局临时表或锁定机制来创建表(如果它不存在):

      declare @rc int
      begin tran
      
      exec @rc = sp_getapplock 'mygloballock', 'exclusive', 'transaction'
      if (@rc >= 0)
      begin
          -- got the lock, if the table doesn't exist, create it
          if object_id('tempdb..##TempStudentRegistration') is null
              select top 0 * into ##TempStudentRegistration from Student
      
          exec sp_releaseapplock 'mygloballock'
          commit tran
      
          insert into ##TempStudentRegistration
             select * from Student
      end
      else
      begin
          raiserror('you did not get the app lock', 16, 1)
      end     
      
    2. 最后,如果您实际上不需要全局临时表(即,您不需要从另一个会话访问数据),请考虑使用本地临时表(使用单##),已经为您设置了当前会话的范围:

      select * into #TempStudentRegistration From Students
      
    3. 如果您不确定应该使用哪种类型的临时表,这里有一个很好的答案描述您的选项:https://stackoverflow.com/a/2921091/4313829