探究临时表

1825 2002-05-29 03:08:09
1.何时创建新的临时表
每在查询分析器中打开一个新的窗口就可以建立独立的临时表[create table #temp_table (c_cinvcode varchar(20))]
当vb客户端程序运行时窗口联接(cnn)后可以建立独立的临时表

推论:每一个联接(cnn)对应一个临时表

问题1:vb客户端程序用sql语句建立临时表1后再通过存储过程建立临时表2并访问临时表1.存储过程中可访问客户端建立的临时表1,但客户端程序却无法使用存储过程创建的临时表2
问题2:临时表何时被干掉?
vb窗体卸载后载打开可建立临时表
联接对象释放后不可建立临时表??下例 第二次运行模块会在create #temp_table 时报错


例:
'vb程序代码
Public Sub fillbill()
Dim sql_str As String
Dim rst As New ADODB.Recordset
Dim cnn As New ADODB.Connection
cnn.open "Provider=SQLOLEDB.1 *********"
rst.Open "create table #temp_table (c_cinvcode varchar(20))",cnn'√
rst.Open "select * from #temp_table", cnn '√
If rst.State = 1 Then rst.Close
rst.Open "exec tem_procedure", cnn '√
MsgBox rst.Fields(0) '√
If rst.State = 1 Then rst.Close rst.Open "select * from #temp_table1", cnn '×
If rst.State = 1 Then rst.Close
Set rst = Nothing
if cnn.state = 1 then cnn.close
set rst = nothing
end Sub

--sqlserver 2000
create procedure tem_procedure

as
set nocount on
create table #temp_table1 (cinvccode varchar(20))
insert into #temp_table(c_cinvcode) values('1')
select * from #temp_table
GO
...全文
115 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
1825 2002-05-30
  • 打赏
  • 举报
回复
gmc007(江西的佬表) :
临时表可以存放临时数据.但我们觉着这只是一个方面,更大用处是在多用户操作时,对用每个用户不同的连接可生成独立的临时表.以免用户操作相互影响.
我是想问用户在什么情况下可以建立新的临时表
rst.Open "create table #aa(a char) ", sTpublic.oLocalAccountConnection
str = sTpublic.oLocalAccountConnection
cnn.Open str
rst1.Open "create table #aa(a char) ", sTpublic.oLocalAccountConnection

rst1.Open "create table #aa(a char) ", cnn

1,3可以建立但2不行?是否说明每个联接对应一个临时表?
gmc007 2002-05-30
  • 打赏
  • 举报
回复
1.局部临时表,你想什么时候建立就建立(你的推论是不对的)
2.你可以删除临时表(DROP TABLE #TMP),也可以不删除,因为它的生存期只限于一个会话期间(SESSION)
3.全局临时表,你想什么时候建立就建立,不同的是它的生存期限于一个连接。
4.临时表的作用,我想是用于存放临时数据(就像变量一样,哦,说到这,好像SQL2000已有了TABLE类型的变量)。
-----------
如果你想很好的理解的话,可以到“SQL QUERY ANALYZER”去试验一下。
Tome_ming 2002-05-30
  • 打赏
  • 举报
回复
临时表的创建随过程的产生而产生,随过程的消亡而消亡。vb客户端程序用sql语句建立临时表1后再通过存储过程建立临时表2并访问临时表1,是因为客户创建之后这个过程还没有完成,因而存储过程可以访问它,而存储过程一旦运行完毕,它的临时表也不存在了,故客户端程序却无法使用存储过程创建的临时表2。使用临时表一般都是为了返回一个记录集。
胡楮智 2002-05-30
  • 打赏
  • 举报
回复
# 建的临时表,只能在存储过程中被引用,过程结束自动删除!
## 建的临时表,是存在于服务器内存中的,可以象普通表一样引用
需要用命令删除 !
1825 2002-05-30
  • 打赏
  • 举报
回复
问题解决一部分了,谢谢


1)CREATE PROCEDURE [dbo].[a] AS
exec("create table #a (a char)")
select * from #a
GO
运行存储过程a会报错
是否可认为 exec()会产生一个独立的 会话/进程?
2)
/**所有其它本地临时表在当前会话结束时自动除去。**/
当vb中用ado创建联接并建立临时表时,临时表什么时候会自动被干掉?
也就是说 怎样让使用临时表的会话结束?

用空要看看联机帮助了 :)
gmc007 2002-05-30
  • 打赏
  • 举报
回复
哈哈,标准答案来了!(来自SQL SERVER 2000 帮助文档)
=================

临时表
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。

本地临时表的名称前面有一个编号符 (#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 语句完成后,将自动除去此表。
在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO

下面是结果集:

(1 row(s) affected)

Test1Col
-----------
1

(1 row(s) affected)

Test2Col
-----------
2

当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。有关更多信息,请参见 table。

1825 2002-05-30
  • 打赏
  • 举报
回复
bestofbest(咖啡)
什么意思?
有什么不明白的?
bestofbest 2002-05-30
  • 打赏
  • 举报
回复
我还不明白
收藏了也看不明白
所以不收藏


人总是要成长的,让我们大家一起在CSDN里成长为新一代的高手吧!
想吵架的人闪一边去,我们只来学习,不学习的请安静!!!
gmc007 2002-05-30
  • 打赏
  • 举报
回复
嗯,我想关键的还是要理解“会话”(SESSION)

另外,在创建之前最好先检查数据库中是否有同名的对象存在

if not exists(select name from sysobjects where id = object_id('yourtable'))
begin
print 'ni hao'
end
yclyz 2002-05-30
  • 打赏
  • 举报
回复
我也正需要
Do_Better 2002-05-30
  • 打赏
  • 举报
回复
呵呵,我正需要
1825 2002-05-30
  • 打赏
  • 举报
回复
Tome_ming:
过程是什么意思?
在sql中使用exec()是不是过程?
exec("create table #aa(a char) ")
select * from #aa
要报错的.
1825 2002-05-29
  • 打赏
  • 举报
回复
另:
全域的temp table (##)怎样理解?(何时建立,何时被干掉?)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧