我想将临时表从一个执行路径传递到另一个嵌套在它旁边的路径
我试过的是:
DECLARE @SQLQuery AS NVARCHAR(MAX)
SET @SQLQuery = '
--populate #tempTable with values
EXECUTE('SELECT TOP (100) * FROM ' + tempdb..#tempTable)
EXECUTE sp_executesql @SQLQuery
但它失败并显示以下错误消息:
'tempdb'
附近的语法不正确
是否有另一种\更好的方法在执行上下文之间传递临时表?
答案 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 + '') '