高手帮我看看存储过程创建里创建全局临时表的问题

monday 2007-10-16 10:41:15
存储过程如下:
CREATE procedure xp_checktemptable
(
@v_userid varchar(5),
@i_out int out
)
as declare @v_sql varchar(100);
begin
if object_id('tempdb.dbo.##'+@v_userid) is null
begin
set @v_sql = 'create table ##'+@v_userid+' (userid varchar(5))';
exec (@v_sql);
set @i_out = 0;
end
else
set @i_out = 1;
end;
GO

在本地个人版SQL SERVER里调试是通过的,第一次执行,I_OUT=0,第二次执行I_OUT=1。
可是在数据库服务器上建立相同的存储过程,I_OUT始终为0

谁来帮助我啊。
...全文
50 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Limpire 2007-10-16
其实你的ASP代码肯定创建了临时表,只不过ASP代码结束,临时表也结束了,所以你看不到。

如果你在ASP代码里设置延时,比如延时30秒,那么在30秒内你肯定可以看到ASP创建的临时表,30秒后ASP代码一结束,临时表也就销毁不见了,你可以测试一下。

存储过程没问题,关键是全局临时表的生命周期问题。
回复
Limpire 2007-10-16
全局临时表或临时表,只在会话期间有效。

当前会话创建的全局临时表,当前会话结束时,所创建的全局临时表如果仍被别的会话引用,那么全局临时表继续有效,当所有会话对该全局临时表的引用结束,该全局临时表正式消失。
回复
OracleRoob 2007-10-16
全局临时表在当前会话结束前,允许其他用户访问,但当当前会话结束后,就自动销毁。

而局部临时表,只在当前会话可见。
回复
OracleRoob 2007-10-16
3楼说的有道理,全局临时表在会话结束后,就自动销毁了。
回复
OracleRoob 2007-10-16
每次在ASp执行前,打开事件探查器,跟踪一下,看看真正提交给SQLserver的语句是什么。

估计你提供的第一个参数有可能有空导致。
回复
Limpire 2007-10-16
set pCmd = nothing
--------------------
这样即使是全局临时表,生命期也结束啦,当然每次都要重建,所以每次I_OUT始终为0
回复
monday 2007-10-16
在ASP里执行的。

iout=0
set pCmd = Server.CreateObject("ADODB.Command")
pCmd.ActiveConnection = Conn
pCmd.CommandType=4 'adCmdStoredProc
pCmd.CommandText = "xp_checktemptable"
pCmd.Parameters.Append pCmd.CreateParameter("userid", adVarChar, adParamInput, 5, "")
pCmd.Parameters.Append pCmd.CreateParameter("out", adInteger, adParamOutput, 4, iout)
pCmd.Parameters("userid") = cstr(rs("id"))
set res = pCmd.Execute(,,adCmdStoredProc+adExecuteNoRecords)
Response.Write cstr(pCmd.Parameters("out").Value)
pCmd.activeconnection = nothing
set pCmd = nothing


@v_sql就是比如 create table ##10000 (userid varchar(5))
这个在查询分析器里是正常的,在sysobjects里可以看到创建的临时表。但是在ASP里执行就是查不到有创建临时表。
回复
OracleRoob 2007-10-16

通过什么方式调用的?

直接在查询分析器中执行的?

每次执行时,把@v_sql的内容print出来看看。
回复
发动态
发帖子
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
社区公告
暂无公告