代码之家  ›  专栏  ›  技术社区  ›  Shachaf.Gortler

将临时表从一个执行传递到另一个执行

  •  1
  • Shachaf.Gortler  · 技术社区  · 10 年前

    我想将一个临时表从一个执行路径传递到另一个嵌套在其中的执行路径

    我所尝试的是:

        DECLARE @SQLQuery AS NVARCHAR(MAX)
    
        SET @SQLQuery = ' 
        --populate #tempTable with values   
        EXECUTE('SELECT TOP   (100)    * FROM ' + tempdb..#tempTable) 
    
        EXECUTE sp_executesql @SQLQuery
    

    但它失败并显示以下错误消息:

    “tempdb”附近的语法不正确

    在执行上下文之间传递临时表还有其他更好的方法吗?

    4 回复  |  直到 10 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    您可以使用 ##tablename 语法(双散列)。差异已解释 on the TechNet site :

    有两种类型的临时表:本地表和全局表。它们在名称、可见性和可用性方面彼此不同。本地临时表具有一个数字符号(#)作为其名称的第一个字符;它们仅对用户的当前连接可见,当用户从SQL Server实例断开连接时,它们将被删除。全局临时表有两个数字符号(##)作为其名称的第一个字符;它们在创建后对任何用户都是可见的,并且当引用该表的所有用户从SQL Server实例断开连接时,它们将被删除。

    例如,如果创建表employees,则在删除该表之前,数据库中具有安全权限的任何人都可以使用该表。如果数据库会话创建了本地临时表#employees,则只有该会话可以使用该表,当会话断开连接时,该表将被删除。如果创建全局临时表##employees,则数据库中的任何用户都可以使用该表。如果在创建该表后没有其他用户使用该表,则断开连接时会删除该表。如果另一个用户在您创建表之后使用该表,则SQL Server会在您断开连接并且所有其他会话不再积极使用该表之后将其删除。

    如果使用命名约束创建临时表,并且临时表是在用户定义的事务范围内创建的,则一次只能有一个用户执行创建临时表的语句。例如,如果存储过程创建了一个具有命名主键约束的临时表,则该存储过程不能由多个用户同时执行。

    下一个建议可能更有用:

    临时表的许多用途可以用具有表数据类型的变量替换。有关使用表变量的更多信息,请参见 table (Transact-SQL) .

        2
  •  1
  •   Sean Lange    10 年前

    您的临时表将在动态sql中可见,不会出现任何问题。我不确定您是在动态sql中还是以前创建临时表。

    这里是在动态sql之前创建的表。

    create table #Temp(SomeValue varchar(10))
    insert #Temp select 'made it'
    
    exec sp_executesql N'select * from #Temp'
    
        3
  •  1
  •   Tab Alleman    10 年前

    语法错误的原因是您在EXECUTE中执行了不必要的EXECUT,并且没有转义嵌套的单引号。这是正确的写法:

    SET @SQLQuery=' 
    --populate #tempTable with values   
    SELECT TOP 100 * FROM tempdb..#tempTable'
    

    然而,我觉得语法错误只是问题的开始。不过,只能看到这么多代码,不可能知道你最终想在这里做什么。

        4
  •  0
  •   E. Monk    10 年前

    你的报价搞砸了。尝试:

      SET @SQLQuery=' 
        --populate #tempTable with values   
        EXECUTE(''SELECT TOP   100    * FROM '' + tempdb..#tempTable + '') '