试对原Procedure作如下修改:
--------------------------------------------------------------------------------------
/*
set @sql='CREATE TABLE temp (' 
DECLARE  UserName CURSOR FOR select UserName 
OPEN UserName
FETCH NEXT FROM UserName INTO @UserNameif (@@FETCH_STATUS = 0)
 set @sql= @sql+ @UserName+ ' int DEFAULT 0' 
FETCH NEXT FROM UserName INTO @UserName 
WHILE @@FETCH_STATUS = 0
BEGIN
  set @sql= @sql+','+ @UserName+ ' int  DEFAULT 0 '
  FETCH NEXT FROM UserName INTO @UserName      
end
CLOSE UserName
DEALLOCATE UserName
*/--以上代码替换为以下四行代码
set @sql = ''
select @sql = @sql + ',['+UserName+'] int defualt 0 ' from dbo.UserMess
set @sql = stuff(@sql,1,1,'')
set @sql= 'CREATE TABLE temp (' +@sql+',总数 int DEFAULT 0 ,时段 varchar(50) null,时间 datetime )' --增加对表temp是否已经存在的判断
if exists(select 1 from sysobjects where id = object_id('temp'))
    drop table temp--------------------------------------------------------------------------------------
BTW:使用游标太频繁,感觉优化的可能性比较大

解决方案 »

  1.   

    原来就是一个行列转换,  yong lou shang de jiu ke yi le
      

  2.   

    kan cuo le ,shan !
      

  3.   

    在SQL里执行报错:第一行defualt附近有语法错误
      

  4.   

    defualt ==> default 这是一个比较明显的笔误,楼主要自己动动脑筋啊,汗ing
      

  5.   

    不是啊 我对T-SQL语法不熟嘛
    而且又来了:第一行','附近有语法错误
    小弟实在是搞不懂。
      

  6.   

    set @sql='CREATE TABLE temp (' 
    DECLARE  UserName CURSOR FOR select UserName from dbo.UserMess
    OPEN UserName
    FETCH NEXT FROM UserName INTO @UserName
    if (@@FETCH_STATUS = 0)
     set @sql= @sql+ @UserName+ ' int DEFAULT 0' 
    FETCH NEXT FROM UserName INTO @UserName 
    WHILE @@FETCH_STATUS = 0
    BEGIN
      set @sql= @sql+','+ @UserName+ ' int  DEFAULT 0 '
      FETCH NEXT FROM UserName INTO @UserName      
    end
    CLOSE UserName
    DEALLOCATE UserName
     set @sql= @sql+',总数 int DEFAULT 0 ,时段 varchar(50) null,时间 datetime )' 
     exec(@sql)
    ---上面这么一大段就是为了动态生成表temp,
    但是你用的是exec(@sql)那么当跳出exec后,temp就消失了,因为他是一个相对的局部变量,下面你再引用temp当然报找不到temp了.
      

  7.   

    逗号是不能去掉的,整个字符串的第一个逗号是用以下语句删除的:set @sql = stuff(@sql,1,1,'')你先屏蔽后面的代码,在以上语句前后分别将 @sql变量打印出来。
      

  8.   

    set @sql = ''select @sql = @sql + ',['+UserName+'] int defualt 0 ' from dbo.UserMess
    ---[USER1] int default 0,[USER2] int default 0,[USER3] int default 0,......[USER15] in default 0---
    set @sql = stuff(@sql,1,1,'')/*
    set @sql= 'CREATE TABLE temp (' +@sql+',总数 int DEFAULT 0 ,时段 varchar(50) null,时间 datetime )' 
    .
    .
    .
    .
    .
    */
      

  9.   

    --测试以下代码,没有问题:
    if object_id('tt') is not null
      drop table tt
    gocreate table tt(classid varchar(10))
    goinsert into tt
    select 101
    union
    select 102
    union
    select 103
    union
    select 104
    union
    select 105
    union
    select 106
    union
    select 107
    union
    select 108
    union
    select 109
    declare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ',['+classid+'] int default 0 ' from tt
    set @sql = stuff(@sql,1,1,'')
    set @sql= 'CREATE TABLE temp (' +@sql+',总数 int DEFAULT 0 ,时段 varchar(50) null,时间 datetime )' 
    print @sqlif object_id('temp') is not null
    begin
      drop table temp
    endexec(@sql)select * from temp
      

  10.   

    上面的print @sql是必须的吗?
    print @sql我去掉了运行也正常但print @sql对ASP里面有影响如加上了print @sql,在ASP里显示的是@sql的内容  如果不要print @sql,则ASP提示找不到TEMP对象
      

  11.   

    根据 libin_ftsafe(子陌红尘) 老大的代码,我改了一下,全部代码为:CREATE     proc p7
      @btime datetime,
      @etime datetime,
      @flag int  
      as
    declare @temptime datetime
    declare @temptime1 datetime
    declare @mydate datetime
    declare @UserName varchar(50)
    declare @sql varchar(500)
    declare @str varchar(10)
    declare @icount int
    declare @i int
    set @icount=0
    set @sql = ''
    select @sql = @sql + ',['+UserName+'] int default 0 ' from dbo.UserMess
    set @sql = stuff(@sql,1,1,'')
    set @sql= 'CREATE TABLE temp (' +@sql+',总数 int DEFAULT 0 ,时段 varchar(50) null,时间 datetime )' 
    if object_id('temp') is not null
    begin
      drop table temp
    end
     exec(@sql)
     set @temptime=@btime while (@temptime< @etime) 
     begin
      insert into temp(时间) values(@temptime)
      if (@flag=1)
      set @temptime=DATEADD(day, 1, @temptime)
      if (@flag=2)
      set @temptime=DATEADD(Month, 1, @temptime)  
     end
    ----------------
    ---读出TEMP表的数据。用时间字段查数据
    set @temptime=@btimeDECLARE  mydate CURSOR FOR select 时间 from dbo.temp
    open mydate
    FETCH NEXT FROM mydate INTO @mydate 
    WHILE @@FETCH_STATUS = 0
    BEGIN
     --更新TEMP的对应列
      DECLARE  UserName CURSOR FOR select UserName from dbo.UserMess
      OPEN UserName
      FETCH NEXT FROM UserName INTO @UserName 
      WHILE @@FETCH_STATUS = 0
      BEGIN
      if (@flag=1)
      set @temptime1=DATEADD(day, 1, @mydate)
      if (@flag=2)
      set @temptime1=DATEADD(Month, 1, @mydate)
       select @icount=0
       --select convert(varchar,@temptime), convert(varchar,@temptime1) 
       select @icount= count(*) from vcase where username=@UserName and TelComeTime between  @mydate and @temptime1
      
       set @sql='update temp set '+@UserName+'='+convert(varchar(4),@icount)+' where 时间='''+convert(varchar,@mydate)+''''
       exec(@sql)
      FETCH NEXT FROM UserName INTO @UserName      
      end
      CLOSE UserName
      DEALLOCATE UserName
    -----------  
    FETCH NEXT FROM mydate INTO @mydate     
    end
    CLOSE mydate
    DEALLOCATE mydate
    --TEMP中的整理数据
    DECLARE  mydate CURSOR FOR select 时间 from dbo.temp
    open mydate
    FETCH NEXT FROM mydate INTO @mydate 
    WHILE @@FETCH_STATUS = 0
    BEGIN
      if (@flag=1)
        set @str=convert(varchar,year(@mydate))+'-'+convert(varchar,month(@mydate))+'-'+convert(varchar,day(@mydate))
      if (@flag=2)
        set @str=convert(varchar,year(@mydate))+'-'+convert(varchar,month(@mydate))
     UPdATE TEMP SET 时段=@str where 时间= @mydateFETCH NEXT FROM mydate INTO @mydate    
    END
    CLOSE mydate
    DEALLOCATE mydate
    --统计每行的总数  DECLARE  UserName CURSOR FOR select UserName from dbo.UserMess
      OPEN UserName
      FETCH NEXT FROM UserName INTO @UserName 
      WHILE @@FETCH_STATUS = 0
      BEGIN
      set @sql='update temp set 总数=总数+'+@UserName
       exec(@sql)   set @icount= @icount+@i  
       FETCH NEXT FROM UserName INTO @UserName      
      end
      CLOSE UserName
      DEALLOCATE UserName
    ----------------select * from temp
    DROP TABLE temp
    GO在SQL里已调试成功了
    但在ASP里一直报错,说对象名 'temp' 无效<%
    set rs = server.CreateObject("adodb.recordset")
    sql="p7 [2004-12-1], [2005-1-1], [2]"
    conn.cursorlocation = 3
    set rs=server.createobject("adodb.recordset")
    rs.open sql,conn,3,3
    %>这是我最近最后一个问题,请帮帮我
      

  12.   

    好象问题就出在
     while (@temptime< @etime) 
     begin
      insert into temp(时间) values(@temptime)
      if (@flag=1)
      set @temptime=DATEADD(day, 1, @temptime)
      if (@flag=2)
      set @temptime=DATEADD(Month, 1, @temptime)  
     end特别怀疑insert into temp(时间) values(@temptime)这句话
      

  13.   

    换号了,感谢 libin_ftsafe(子陌红尘)