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

时间:2016-02-05 20:58:59

标签: sql sql-server sql-server-2012

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

我试过的是:

    DECLARE @SQLQuery AS NVARCHAR(MAX)

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

    EXECUTE sp_executesql @SQLQuery

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

  

'tempdb'

附近的语法不正确

是否有另一种\更好的方法在执行上下文之间传递临时表?

4 个答案:

答案 0 :(得分:2)

您可以使用##tablename语法(双重哈希)创建全局临时表。区别在于on the TechNet site

  

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

     

例如,如果您创建表employees,则任何具有数据库安全权限的人都可以使用该表来使用该表,直到删除该表为止。如果数据库会话创建本地临时表#employees,则只有会话可以使用该表,并且会话断开连接时将删除该会话。如果创建全局临时表## employees,则数据库中的任何用户都可以使用此表。如果在创建表后没有其他用户使用此表,则断开连接时将删除该表。如果其他用户在创建表之后使用该表,则SQL Server会在断开连接后以及在所有其他会话不再主动使用它之后将其删除。

     

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

下一个建议可能会更有帮助:

  

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

答案 1 :(得分:1)

您的临时表将在动态sql中可见,没有任何问题。我不确定你是在动态sql中还是之前创建临时表。

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

create table #Temp(SomeValue varchar(10))
insert #Temp select 'made it'

exec sp_executesql N'select * from #Temp'

答案 2 :(得分:1)

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

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

但是,我觉得语法错误只是问题的开始。不可能告诉你最终想要做什么,只看到这么多的代码。

答案 3 :(得分:0)

你的报价搞砸了。尝试:

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