存储过程如下:
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谁来帮助我啊。

解决方案 »

  1.   


    通过什么方式调用的?直接在查询分析器中执行的?每次执行时,把@v_sql的内容print出来看看。
      

  2.   

    在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里执行就是查不到有创建临时表。
      

  3.   

    set pCmd = nothing
    --------------------
    这样即使是全局临时表,生命期也结束啦,当然每次都要重建,所以每次I_OUT始终为0
      

  4.   

    每次在ASp执行前,打开事件探查器,跟踪一下,看看真正提交给SQLserver的语句是什么。估计你提供的第一个参数有可能有空导致。
      

  5.   

    其实你的ASP代码肯定创建了临时表,只不过ASP代码结束,临时表也结束了,所以你看不到。如果你在ASP代码里设置延时,比如延时30秒,那么在30秒内你肯定可以看到ASP创建的临时表,30秒后ASP代码一结束,临时表也就销毁不见了,你可以测试一下。存储过程没问题,关键是全局临时表的生命周期问题。