2016-02-05 35 views
1

我想从一个执行路径通过一个临时表到另一个嵌套在侧它传递临时表从一个执行到另一个

我曾尝试是这样的:

DECLARE @SQLQuery AS NVARCHAR(MAX) 

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

    EXECUTE sp_executesql @SQLQuery 

但它失败与此错误消息:

附近有语法错误的tempdb'

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

回答

1

您的临时表将在动态sql内部可见,没有问题。我不知道你是否在动态sql或之前创建临时表。

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

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

exec sp_executesql N'select * from #Temp' 
2

您可以使用##tablename语法(双重散列)创建全局临时表。所不同的是on the TechNet site

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

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

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

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

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

+1

我会在几乎所有情况下避免全局临时表。他们有一些常常被忽视的严重问题。它们可用于任何连接,因此并发性是一场噩梦。 –

+0

我把这个问题看成是“我想把临时表从一个执行路径传递给另一个执行路径”,并且没有看到下一个短语“嵌套在里面”。对于不同上下文中的不同执行路径,很少有选项可用,而全局临时表是保存中间聚合数据以供其他调用者以后使用的良好解决方案。如果一切都在同一个查询会话中,完全同意 - 我不会使用全局临时表。 – Cahit

+0

在SQL作业中创建全局临时表如何更安全? –

1

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

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

但是,我有一种感觉,语法错误只是你的问题的开始。虽然不可能告诉你最终在这里做什么,但只能看到这么多的代码。

+0

嵌套执行的原因是我从中填充tempTable是动态的表名 –

0

你的报价搞砸了。尝试:

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