看 Execute能不能将#Temp_1返回来

解决方案 »

  1.   

    exec是执行存储过程的意思。
    临时表在EXEC内外执行是有区别的
    我引一段文字,希望对你有帮助:
    临时表
    可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
    INSERT INTO #MyTempTable VALUES (1)如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去: 当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。所有其它本地临时表在当前会话结束时自动除去。全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。 
      

  2.   

    哦,是这样,也就是说局部临时表在就像临时变量一样,过程结束消失。
    我试了用全局的,很好用。但是我看到书上说全局表一旦建立,所有的用户都会使用它,直到创建用户取消并且最后一位用户使用完毕。可是我只不过是让这个表当一个中间临时表,也就是说只想让当前的用户使用它,并且还得动态SQL,我应该写,也就说,如何能够使用动态的sql生成一个临时表to armadawang(wjq):如果不指定 into #temp_1,可以返回,else no
      

  3.   

    在 MS SQL 中
    建议所有的处理都在动态sql字符串中进行,我也碰到这个问题,在动态sql中生成的
    临时表不能在存储过程里引用,才采用生成一个很大的动态sql,在动态sql中返回结果。
    如果谁有好方法,请告诉我。
    可以改成这样。
    declare @v_sqlstring varchar(1000)
    select @v_sqlstring='select * into #temp_1 from table1 select * from #temp_1 drop table #temp_1'
    execute(@v_sqlstring)可以用游标实现将动态Sql的结果传出来。
    系统默认的游标是全局的!
    全局和局部游标都是对本身的连接来说的,游标只能在本身的连接内可见。
    下面是求某个表记录总数的例子,用游标将动态Sql的结果传出来。
    create PROCEDURE prtest
      @tablename as varchar(20)='sysobjects'
    as
    Declare @sql  varchar(200)
    declare @RecCount integerselect @sql='declare test cursor for select RecCount=count(*) from '+@tablename
    exec(@sql)
    open test
    fetch next from test into @RecCount
    print @RecCount
    close test
    DEALLOCATE test    下面是求所有表记录总数的例子,用动态sql实现。if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tablerecordcnt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[tablerecordcnt]
    GOCREATE TABLE [dbo].[tablerecordcnt] (
    [name] [varchar] (128) NOT NULL ,
    [cnt] [int] NOT NULL 
    ) ON [PRIMARY]
    GO
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[prtablerecordcnt]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[prtablerecordcnt]
    GOSET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS OFF 
    GOCREATE  PROCEDURE dbo.prtablerecordcnt
     AS
    set nocount on 
    declare @name varchar(128)
    truncate table tablerecordcnt
    declare crtable cursor local for select u.name+'.'+o.name from sysobjects o join sysusers u on o.uid=u.uid where type='U'
    open crtable
    fetch next from crtable into @name
    while @@fetch_status=0
      begin
         declare @sql varchar(1000)
         set @sql='declare @cnt int select @cnt=count(*) from '+@name+' insert tablerecordcnt values('''+@name+''',@cnt)'
         exec(@sql)
         fetch next from crtable into @name
       end     
    close crtable
    deallocate crtable
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO