【问题标题】:error in creating a temp table using dynamic sql使用动态 sql 创建临时表时出错
【发布时间】:2012-02-18 05:49:04
【问题描述】:
declare @TableName nvarchar(max)
set @TableName='addresses'

DECLARE @sql NVARCHAR(MAX)
set @sql= 'create table #tempadd ( '
SELECT @sql=@sql + STUFF( -- Remove first comma  
(  
 SELECT  ', ' + column_name+' '+ case when DATA_TYPE='varchar' then DATA_TYPE +'(500)' else DATA_TYPE end   FROM -- create comma separated values  
 (  
   SELECT column_name,DATA_TYPE FROM information_schema.columns  where table_name = @TableName --Your query here  
 ) AS T FOR XML PATH('')  
)  
,1,1,'')  

set @sql =@sql+' ) '


print @sql 

--SET @sql='SELECT * into #tempadd FROM '+@TableName+  ' WHERE 1=2'


EXEC sp_executesql @sql

select * from #tempadd

这会导致错误:

消息 208,第 16 级,状态 0,第 25 行
对象名称“#tempadd”无效。

【问题讨论】:

标签: sql sql-server-2005 dynamic-sql


【解决方案1】:

您的临时表仅限于动态查询的范围,因为它是在其中定义的。

您可以将select * from #tempadd 语句添加到@sql 查询的末尾。或者,我认为您可以在动态查询之前定义#tempadd,它应该可以访问,但我不确定。

【讨论】:

    【解决方案2】:

    thanks to this blog

    这里的问题是会话的范围。当我们通过 EXEC 或 sp_executesql 执行动态 sql 时,会为子会话创建一个新范围。一旦会话关闭,在该会话中创建的所有对象都会被删除。

    我为这个问题找到的一个解决方案是在“父”范围内创建表,然后只使用动态 sql 来修改表。为此,将使用最少的列集创建一个表。然后我们使用带有动态 SQL 的 ALTER TABLE 语句。子会话可以访问在父会话中创建的对象,因此可以使用动态 sql 修改表:

    DECLARE @SQL NVARCHAR(4000)
    CREATE TABLE #Temp ( id int null)
    SELECT @SQL = 'ALTER #Temp ADD Col1 int null'
    EXEC (@SQL)
    SELECT * FROM #Temp
    DROP TABLE #Temp
    

    这个表格是可见的,两列都会显示出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多