看 Execute能不能将#Temp_1返回来
解决方案 »
- 多条记录合计成一条
- 求各位大虾帮助,怎样可以快速生成求和的语句
- FOX FOR DOS 25 版本 与SQL SERVER 2000 连接问题
- 求助:关于DTS发送MAILE的问题
- openrowset将数据导出到excel表中
- 关于SQL SERVER内存泄漏问题????
- login failed for user 'Administrator'无法指出错误!!
- SQL语句用了关键字DISTINCT,还能用关键字TOP吧?
- 如何在ASP页面中显示SQL SERVER数据库的序列数?
- sql6.5解密存储过程(在线等待,分数不够可以再加)
- 去处空格!帮帮忙!
- 怎么样将具有Identity属性的值插入一个临时表中并去掉Identity属性
临时表在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 语句完成后,将自动除去此表。
我试了用全局的,很好用。但是我看到书上说全局表一旦建立,所有的用户都会使用它,直到创建用户取消并且最后一位用户使用完毕。可是我只不过是让这个表当一个中间临时表,也就是说只想让当前的用户使用它,并且还得动态SQL,我应该写,也就说,如何能够使用动态的sql生成一个临时表to armadawang(wjq):如果不指定 into #temp_1,可以返回,else no
建议所有的处理都在动态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