在动态SQL中创建动态表,并在动态SQL之外引用它

时间:2017-02-09 17:32:52

标签: sql sql-server tsql

请参阅以下代码:

select top 1 * into #dbusers from dbusers

declare @tsql as varchar(1000)
set @tsql = 'select * from #dbusers'
exec (@tsql)

这正如我所料,即动态SQL返回一行。是否可以这样做:

declare @tsql as varchar(1000)
set @tsql = 'select top 1 * into #dbusers from dbusers'
exec (@tsql)

select * from #dbusers

我收到错误:

  

无效的对象名称'#dbusers'

有解决方法吗?

我意识到你可以使用动态SQL获得输出参数。但是,我也知道在使用存储过程时,您不能将表作为输出参数返回。

有可能这样做吗?是否有解决方法(创建物理表除外)?

1 个答案:

答案 0 :(得分:2)

临时表仅在创建它们的会话中可用。使用Dynamic SQL,这意味着在运行Dynamic SQL后它不可用。您的选择是:

  1. 创建一个全局临时表,它将在会话之外保留,直到以另一种方式显式删除或清除TempDB,使用双哈希:create table ##GlobalTemp
    由于此表在会话外持续存在,因此您需要确保不创建其中两个或有两个不同的进程尝试处理其中的数据。您需要有一种方法来唯一标识要处理的全局临时表。
  2. 您可以创建一个常规表,然后记得再次删除它。
  3. 包括在动态SQL脚本中引用临时表所需的任何逻辑
  4. 对于您的特定实例,您最好只执行一个select into,它将根据所选数据生成您的表结构。