你的根本不是临时表,多个用户操作时当然会出问题.看你的存储过程,你生成的表在存储过程后边还要调用到,是吧?
那就改用全局临时表:CREATE PROCEDURE dbo.Gen_T_EmployeePayrollDetail 
@tbname varchar(250) output        --加一个输出参数,返回此存储生成的全局临时表的表名,以方便其他过程调用
AS
declare @sql varchar(8000)
set @tbname='[T_EmployeePayrollDetail_'+cast(newid() as varchar(40))+']' --生成一个临时表名
set @sql='select employee_code'
select @sql=@sql+',sum(case when payroll_item_uuid='''+payroll_item_uuid+''' then amount end) ['+payroll_item_uuid+']' 
from (select distinct payroll_item_uuid from employee_payroll_item_detail) a
set @sql=@sql+' into '+@tbname+' from  employee_payroll_item_detail group by employee_code'
exec (@sql)
GO

解决方案 »

  1.   

    调用时用:
    declare @tbname varchar(250)
    exec Gen_T_EmployeePayrollDetail ,@tbname outputprint '已经生成临时表:'+@tbname--处理完成后删除全局临时表.
    exec('drop table '+@tbname)
      

  2.   

    谢谢!我有两个问题:1)我是用VB+SQL开发,几个客户端会同时操作数据库。以上存储过程会在vb中调用,我想有两种方法可以调用,一是由存储过程返回表名参数,二是将表名参数由vb生成,传给存储过程,那种方法更简单或可行呢?2)以上存储过程是否可以用带#或##的临时表实现呢?请各位指教!
      

  3.   

    由存储过程返回表名参数,提示出错:不正常地定义了参数对象,提供了不一致或不完整的信息!
        
    我的存储过程如下:CREATE PROCEDURE dbo.prGen_T_EmployeePayrollDetail 
    @tbname varchar(250) output     
    AS
    declare @sql varchar(8000)
    set @tbname='[T_EmployeePayrollDetail_'+cast(newid() as varchar(40))+']' 
    set @sql='select employee_uuid, employee_code, official_name, business_unit, department, year, period '
    select @sql=@sql+',sum(case when payroll_item_uuid='''+payroll_item_uuid+''' then amount end) ['+payroll_item_uuid+']' 
    from (select distinct payroll_item_uuid from employee_payroll_item_detail) a
    set @sql=@sql+' into '+@tbname+' from  employee_payroll_item_detail where flag_payroll=1 and flag_person=1 group by employee_uuid, employee_code, official_name, business_unit, department, year, period '
    exec (@sql)
    GO调用的VB代码如下Private Sub Gen_T_EmployeePayrollDetail(ByRef TableName As String)
        Dim strSQL As String
        Dim cmd As New ADODB.Command
        Dim rst As New ADODB.Recordset
        Dim param As New ADODB.Parameter
        
        With cmd
            .ActiveConnection = gobjConnection
            .CommandText = "prGen_T_EmployeePayrollDetail"
            .CommandType = adCmdStoredProc
            Set param = cmd.CreateParameter("Output", adVarChar, adParamOutput, , 0)
            .Parameters.Append param
        End With
        
        Set rst = cmd.Execute
              
        TableName = cmd(0)
        
        Set cmd = Nothing
        rst.Close
        Set rst = Nothing
        
    End Sub参数的定义哪里有错呢?
      

  4.   

    @tbname是参数
    你怎么又对传进去的参数付值?
      

  5.   

    另外
    内存表需要定义啊
    create table #tablename ....................
    然后在select * into #tablename....
    最后是返回rs用的为select * from #tablename
    删除表drop #tablename
      

  6.   

    可以讲的详细些吗?返回值究竟该如何取呢?output参数需要定义吗?如何定义呢?
    我试过如下语句:Set param = cmd.CreateParameter("Output", adVarChar, adParamOutput)发生同样错误。
      

  7.   

    tablename是返回的值,即由存储过程产生的表名!
      

  8.   

    问题已解决,在CREATEPARAMETER()中加入第三个参数SIZE后,无错误提示,功能实现成功!谢谢大家!