CREATE PROCEDURE MODI_JSRQ
AS
BEGIN
DECLARE @dhhm      NVARCHAR(12)
DECLARE @gs02   NVARCHAR(4)
DECLARE @kdzh      NVARCHAR(20)
DECLARE @tabname  NVARCHAR(20)DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%';SELECT @tabname = NULL
OPEN tab FETCH NEXT FROM tab INTO @tabname
WHILE (@@FETCH_STATUS = 0)
BEGIN
--这儿应该有问题吧.
EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')

解决方案 »

  1.   


    CLOSE cur
    DEALLOCATE cur 
    挪到FETCH NEXT FROM tab INTO @tabname 
    这一句的前面试试.
    CREATE PROCEDURE MODI_JSRQ
    AS
    BEGIN
    DECLARE @dhhm      NVARCHAR(12)
    DECLARE @gs02   NVARCHAR(4)
    DECLARE @kdzh      NVARCHAR(20)
    DECLARE @tabname  NVARCHAR(20)DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%';SELECT @tabname = NULL
    OPEN tab FETCH NEXT FROM tab INTO @tabname
    WHILE (@@FETCH_STATUS = 0)
    BEGINEXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')SELECT @dhhm = null,@gs02 = null,@kdzh = null
    OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    IF (@gs02 = substring(@tabname,10,3))
    BEGIN
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>''))
    BEGIN
    IF (@kdzh='' OR  @kdzh IS NULL)
    BEGIN
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    ENDIF (@kdzh!='' OR  @kdzh IS NOT NULL)
    BEGIN
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)END
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULLENDEND
    END
    SELECT @tabname = NULL
    CLOSE cur
    DEALLOCATE cur
    FETCH NEXT FROM tab INTO @tabnameEND
    CLOSE tab
    DEALLOCATE tabEND
      

  2.   

    動態游標的用法
    http://blog.csdn.net/roy_88/archive/2007/11/09/1875264.aspx
      

  3.   

    BEGIN
    END
    太平了,所以取消游标的语句写错位置了
    CREATE PROCEDURE MODI_JSRQ 
    AS 
    BEGIN 
    DECLARE @dhhm      NVARCHAR(12) 
    DECLARE @gs02   NVARCHAR(4) 
    DECLARE @kdzh      NVARCHAR(20) 
    DECLARE @tabname  NVARCHAR(20) DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%'; SELECT @tabname = NULL 
    OPEN tab FETCH NEXT FROM tab INTO @tabname 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN  EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')  SELECT @dhhm = null,@gs02 = null,@kdzh = null 
    OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
    IF (@gs02 = substring(@tabname,10,3)) 
    BEGIN 
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>'')) 
    BEGIN 
    IF (@kdzh='' OR  @kdzh IS NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    END  IF (@kdzh!='' OR  @kdzh IS NOT NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)  END 
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL  END 
    END 
    CLOSE cur 
    DEALLOCATE cur 
    END 
    SELECT @tabname = NULL 
    FETCH NEXT FROM tab INTO @tabname END 
    CLOSE tab 
    DEALLOCATE tab END 
      

  4.   

    CREATE PROCEDURE MODI_JSRQ
    AS
    BEGIN
    DECLARE @dhhm      NVARCHAR(12)
    DECLARE @gs02   NVARCHAR(4)
    DECLARE @kdzh      NVARCHAR(20)
    DECLARE @tabname  NVARCHAR(20)
    DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%';
    SELECT @tabname = NULL
    OPEN tab FETCH NEXT FROM tab INTO @tabname
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')
    SELECT @dhhm = null,@gs02 = null,@kdzh = null
    OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh
    WHILE (@@FETCH_STATUS = 0)  --如果没有取到数据的话会导致cur不能被关闭及deallocate
    BEGIN
    IF (@gs02 = substring(@tabname,10,3))
    BEGIN
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>''))
    BEGIN
    IF (@kdzh='' OR  @kdzh IS NULL)
    BEGIN
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    END
    IF (@kdzh!='' OR  @kdzh IS NOT NULL)
    BEGIN
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    END
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL
    END
    CLOSE cur
    DEALLOCATE cur
    END
    END
    SELECT @tabname = NULL
    FETCH NEXT FROM tab INTO @tabname
    END
    CLOSE tab
    DEALLOCATE tab
    END 
      

  5.   

    TRY:CREATE PROCEDURE MODI_JSRQ 
    AS 
    BEGIN 
        DECLARE @dhhm    NVARCHAR(12) 
        DECLARE @gs02    NVARCHAR(4) 
        DECLARE @kdzh    NVARCHAR(20) 
        DECLARE @tabname NVARCHAR(20) 
        
        DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%'; 
        
        SELECT @tabname = NULL 
        OPEN tab FETCH NEXT FROM tab INTO @tabname 
        
        WHILE (@@FETCH_STATUS = 0) 
        BEGIN 
        
            EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2') 
            
            SELECT @dhhm = null,@gs02 = null,@kdzh = null 
            OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh 
            
            IF (@@FETCH_STATUS = 0) 
            BEGIN 
                IF (@gs02 = substring(@tabname,10,3)) 
                BEGIN 
                    
                    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>'')) 
                    BEGIN 
                        
                        IF (@kdzh='' OR  @kdzh IS NULL) 
                        BEGIN 
                            EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
                        END 
                
                        IF (@kdzh!='' OR  @kdzh IS NOT NULL) 
                        BEGIN 
                            EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
                            EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
                            EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                        END 
                        
                        SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL 
                        
                    END  
                END 
            END 
            
            CLOSE cur 
            DEALLOCATE cur
            
            SELECT @tabname = NULL 
            FETCH NEXT FROM tab INTO @tabname 
        
        END 
        CLOSE tab 
        DEALLOCATE tab END 
      

  6.   

    BEGIN
            EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')
            SELECT @dhhm = null,@gs02 = null,@kdzh = null
            OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh
            WHILE (@@FETCH_STATUS = 0)  --如果没有取到数据的话会导致cur不能被关闭及deallocate
            BEGIN
                IF (@gs02 = substring(@tabname,10,3))
                BEGIN
                    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>''))
                    BEGIN
                        IF (@kdzh='' OR  @kdzh IS NULL)
                        BEGIN
                            EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                        END
                        IF (@kdzh!='' OR  @kdzh IS NOT NULL)
                        BEGIN
                            EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                            EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                            EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                        END
                        SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL
                    END
                    CLOSE cur
                    DEALLOCATE cur
                END
            END
            SELECT @tabname = NULL
            FETCH NEXT FROM tab INTO @tabname
        END
        CLOSE tab
        DEALLOCATE tab
      

  7.   

    CREATE PROCEDURE MODI_JSRQ
    AS
    BEGIN
    DECLARE @dhhm      NVARCHAR(12)
    DECLARE @gs02   NVARCHAR(4)
    DECLARE @kdzh      NVARCHAR(20)
    DECLARE @tabname  NVARCHAR(20)
    DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%';
    SELECT @tabname = NULL
    OPEN tab FETCH NEXT FROM tab INTO @tabname
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')
    SELECT @dhhm = null,@gs02 = null,@kdzh = null
    OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh
    WHILE (@@FETCH_STATUS = 0)  --如果没有取到数据的话会导致cur不能被关闭及deallocate
    BEGIN
    IF (@gs02 = substring(@tabname,10,3))
    BEGIN
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>''))
    BEGIN
    IF (@kdzh='' OR  @kdzh IS NULL)
    BEGIN
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    END
    IF (@kdzh!='' OR  @kdzh IS NOT NULL)
    BEGIN
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
    END
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL
    END
    END
    END CLOSE cur  --应该移动到此处
    DEALLOCATE cur  --应该移动到此处 SELECT @tabname = NULL
    FETCH NEXT FROM tab INTO @tabname
    END
    CLOSE tab
    DEALLOCATE tab
    END 
      

  8.   

    CREATE PROCEDURE MODI_JSRQ 
    AS 
    BEGIN 
    DECLARE @dhhm      NVARCHAR(12) 
    DECLARE @gs02   NVARCHAR(4) 
    DECLARE @kdzh      NVARCHAR(20) 
    DECLARE @tabname  NVARCHAR(20) DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%'; SELECT @tabname = NULL 
    OPEN tab FETCH NEXT FROM tab INTO @tabname 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN DECLARE
    @cur CURSOR,
    @sql nvarchar(4000)
    SET @sql = N'
    SET @cur = cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2
    OPEN @cur
    '
     
    EXECUTE sp_executesql @sql, N'@cur CURSOR OUTPUT', @cur OUTPUTSELECT @dhhm = null,@gs02 = null,@kdzh = null 
    --OPEN cur 
    FETCH NEXT FROM  @cur INTO @dhhm,@gs02,@kdzh 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
    IF (@gs02 = substring(@tabname,10,3)) 
    BEGIN 
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>'')) 
    BEGIN 
    IF (@kdzh='' OR  @kdzh IS NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    END IF (@kdzh!='' OR  @kdzh IS NOT NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) END 
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL 
      --看起来少了一个这个:  FETCH NEXT FROM  @cur INTO @dhhm,@gs02,@kdzh END 
    CLOSE @cur 
    DEALLOCATE @cur 
    END 
    END 
    SELECT @tabname = NULL 
    FETCH NEXT FROM tab INTO @tabname END 
    CLOSE tab 
    DEALLOCATE tab END 
      

  9.   

    还是放错地方了,而且,发现搂主原来就少了语句CREATE PROCEDURE MODI_JSRQ 
    AS 
    BEGIN 
    DECLARE @dhhm      NVARCHAR(12) 
    DECLARE @gs02   NVARCHAR(4) 
    DECLARE @kdzh      NVARCHAR(20) 
    DECLARE @tabname  NVARCHAR(20) DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%'; SELECT @tabname = NULL 
    OPEN tab FETCH NEXT FROM tab INTO @tabname 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN  EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')  SELECT @dhhm = null,@gs02 = null,@kdzh = null 
    OPEN cur 
    FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
    IF (@gs02 = substring(@tabname,10,3)) 
    BEGIN 
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>'')) 
    BEGIN 
    IF (@kdzh='' OR  @kdzh IS NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    END  IF (@kdzh!='' OR  @kdzh IS NOT NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)  END 
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL  END 
    END 
    FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh     --加这一句 END 
    CLOSE cur 
    DEALLOCATE cur 
    SELECT @tabname = NULL 
    FETCH NEXT FROM tab INTO @tabname END 
    CLOSE tab 
    DEALLOCATE tab END 
      

  10.   

    我搞错了一点 
    游标默认是全局的, 可以在EXEC中定义, 并且在外面引用
      

  11.   


    CREATE PROCEDURE MODI_JSRQ 
    AS 
    BEGIN 
    DECLARE @dhhm      NVARCHAR(12) 
    DECLARE @gs02   NVARCHAR(4) 
    DECLARE @kdzh      NVARCHAR(20) 
    DECLARE @tabname  NVARCHAR(20) DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%'; SELECT @tabname = NULL 
    OPEN tab FETCH NEXT FROM tab INTO @tabname 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN  /*这一句在循环时每次都执行,
    而 关闭及销毁游标的语句,你自己看,只在 IF (@gs02 = substring(@tabname,10,3))  这个分支里。当不走这分支时,就会造成游标重复定义。
     将
    CLOSE cur
    DEALLOCATE cur
    两句移到 END 下一行,即 if分支外. 自己调整 
                               由于无法测试,其它问题暂时看不出
    */
    EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')  SELECT @dhhm = null,@gs02 = null,@kdzh = null 
    OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
    IF (@gs02 = substring(@tabname,10,3)) 
    BEGIN 
    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>'')) 
    BEGIN 
    IF (@kdzh='' OR  @kdzh IS NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    END  IF (@kdzh!='' OR  @kdzh IS NOT NULL) 
    BEGIN 
    EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02) 
    EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)  END 
    SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL  END 
    CLOSE cur 
    DEALLOCATE cur 
    END 
    END  SELECT @tabname = NULL 
    FETCH NEXT FROM tab INTO @tabname  END 
    CLOSE tab 
    DEALLOCATE tab END 
      

  12.   

    主是我注释里这段话
    而 关闭及销毁游标的语句,你自己看,只在 IF (@gs02 = substring(@tabname,10,3))  这个分支里。当不走这分支时,就会造成游标重复定义。
      

  13.   

    CREATE PROCEDURE MODI_JSRQ
    AS
    BEGIN
        DECLARE @dhhm      NVARCHAR(12)
        DECLARE @gs02   NVARCHAR(4)
        DECLARE @kdzh      NVARCHAR(20)
        DECLARE @tabname  NVARCHAR(20)
        DECLARE tab cursor for select name from sysobjects where xtype='U' and name like 'Phonedata%';
        SELECT @tabname = NULL
        OPEN tab FETCH NEXT FROM tab INTO @tabname
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
            EXECUTE('DECLARE cur cursor for select dhhm,gs02,kdzh from '+@tabname+' where myzs!=0 and fjbje>0 and hmzt=2')
            SELECT @dhhm = null,@gs02 = null,@kdzh = null
            OPEN cur FETCH NEXT FROM  cur INTO @dhhm,@gs02,@kdzh
            WHILE (@@FETCH_STATUS = 0)  --如果没有取到数据的话会导致cur不能被关闭及deallocate
            BEGIN
                IF (@gs02 = substring(@tabname,10,3))
                BEGIN
                    IF ((@dhhm is NOT NULL AND @gs02 is NOT NULL) OR (@dhhm <>'' AND @gs02 <>''))
                    BEGIN
                        IF (@kdzh='' OR  @kdzh IS NULL)
                        BEGIN
                            EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                        END
                        IF (@kdzh!='' OR  @kdzh IS NOT NULL)
                        BEGIN
                            EXECUTE('UPDATE '+@tabname+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                            EXECUTE('UPDATE UserData'+@gs02+' SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                            EXECUTE('UPDATE UserData SET Jsrq = dateadd(mm,convert(int,Fjbje/Myzs),Jsrq) WHERE dhhm="'+@dhhm+'" and gs02='+@gs02)
                        END
                        SELECT @dhhm = NULL, @gs02 = NULL,@kdzh = NULL
                    END
                END
            END        CLOSE cur  --应该移动到此处
            DEALLOCATE cur  --应该移动到此处        SELECT @tabname = NULL
            FETCH NEXT FROM tab INTO @tabname
        END
        CLOSE tab
        DEALLOCATE tab
    END 
    以上的代码,执行存储过程报7620000列名不存在等等。