DECLARE tempDomainCount CURSOR FOR 这句下面如果用select * from table1是对的,但是用@str就是错的 ,谁能帮我解决下啊,由于业务的原因,sql是用@str拼出来的
declare @str='select * from table1'DECLARE tempDomainCount CURSOR FOR @strOPEN tempDomainCount
FETCH NEXT FROM tempDomainCount  INTO @tm,@ip,@domain
WHILE @@FETCH_STATUS = 0
begin
FETCH NEXT FROM tempDomainCount INTO @tm,@ip,@domain
end
CLOSE tempDomainCount
DEALLOCATE tempDomainCount

解决方案 »

  1.   

    ---例子
    CREATE PROCEDURE dbo.GetZYFZR
      @XMBH nvarchar(6),
     @ZY nvarchar(10)
     
    AS
     declare @RETURN nvarchar(2000)
     declare @TABLERY nvarchar(9)
     declare @XM nvarchar(20)
     declare @SQL nvarchar(200)
     set @RETURN=""
     set @TABLERY="k"+@XMBH+"RY"
     --print @TABLERY
     set @SQL="declare XM_CURSOR cursor for select XM from "+@TABLERY+" where zy='"+@ZY+"' and rylb='03'"
     exec sp_executesql  @SQL
     open  XM_CURSOR
     fetch next from XM_CURSOR into @XM
     while @@fetch_status=0
     begin
      --print @XM
      select @RETURN=@RETURN+ltrim(rtrim(@XM))+" "
      fetch next from  XM_CURSOR into @XM
     end
     close  XM_CURSOR
     deallocate  XM_CURSOR
     select ltrim(rtrim(@RETURN))
    GO
      

  2.   

    CREATE PROCEDURE dbo.GetZYFZR
      @XMBH nvarchar(6),
     @ZY nvarchar(10)
     
    AS
     declare @RETURN nvarchar(2000)
     declare @TABLERY nvarchar(9)
     declare @XM nvarchar(20)
     declare @SQL nvarchar(200)
     set @RETURN=""
     set @TABLERY="k"+@XMBH+"RY"
     --print @TABLERY
     set @SQL="declare XM_CURSOR cursor for select XM from "+@TABLERY+" where zy='"+@ZY+"' and rylb='03'"
     exec sp_executesql  @SQL
     open  XM_CURSOR
     fetch next from XM_CURSOR into @XM
     while @@fetch_status=0
     begin
      --print @XM
      select @RETURN=@RETURN+ltrim(rtrim(@XM))+" "
      fetch next from  XM_CURSOR into @XM
     end
     close  XM_CURSOR
     deallocate  XM_CURSOR
     select ltrim(rtrim(@RETURN))
    GO
      

  3.   

    不知道这个适合你不?/*
    标题:分别使用游标和动态SQL语句完成各列组成SQL语句
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2009-12-01
    地点:广东深圳
    地址:http://topic.csdn.net/u/20091201/23/72896af9-b647-4718-b29e-f6aaef3e258a.html?65000
    *//*
    tablename                                          fieldname                                          isdatetime datetimelength
    -------------------------------------------------- -------------------------------------------------- ---------- --------------
    Ids_ActualData                                     sw1                                                0          NULL
    Ids_ActualData                                     sw2                                                0          NULL
    Ids_ActualData                                     ymdhm                                              1          16
    Ids_Configuration                                  zdID                                               0          NULL
    Ids_Configuration                                  zdmc                                               0          NULL
    Ids_ActualData                                     yl                                                 0          NULLIds_Configuration.zdID zdid,Ids_Configuration.zdmc zdmc,convert(varchar(16),Ids_ActualData.ymdhm,120) ymdhm,Ids_ActualData.sw1 sw1,Ids_ActualData.sw2 sw2 
    其中convert(varchar(16),Ids_ActualData.ymdhm,120)是通过isdatetime来判断的,这里面的16就是datetimelength里存储的,请高手帮忙啊,谢谢
    */--使用油标完成的. 
    create table tb(tablename varchar(20), fieldname varchar(20), isdatetime int,datetimelength int)
    insert into tb values('Ids_ActualData ' , 'sw1' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'sw2' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'ymdhm', 1 , 16)
    insert into tb values('Ids_Configuration' , 'zdID' , 0 , NULL)
    insert into tb values('Ids_Configuration' , 'zdmc' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'yl' , 0 , NULL)
    godeclare @tablename varchar(20), @fieldname varchar(20), @isdatetime int,@datetimelength int;
    declare @sql as varchar(8000)
    set @sql = ''
    declare cur cursor fast_forward for
      select * from tb;
    open cur;
    fetch next from cur into @tablename , @fieldname , @isdatetime ,@datetimelength;
    while @@fetch_status=0
    begin
       if @isdatetime = 1
          set @sql = @sql + 'convert(varchar(' + cast(@datetimelength as varchar) + '),' + @tablename + '.' + @fieldname + ',120) ' + @fieldname + ',' 
       else
          set @sql = @sql + @tablename + '.' + @fieldname + ' ' + @fieldname + ',' 
       fetch next from cur into @tablename , @fieldname , @isdatetime ,@datetimelength;
    end
    close cur;
    deallocate cur;set @sql = left(@sql , len(@sql) - 1)
    print @sql drop table tb/*
    Ids_ActualData .sw1 sw1,Ids_ActualData .sw2 sw2,convert(varchar(16),Ids_ActualData .ymdhm,120) ymdhm,Ids_Configuration.zdID zdID,Ids_Configuration.zdmc zdmc,Ids_ActualData .yl yl
    */
    --使用动态SQL语句完成.
    create table tb(tablename varchar(20), fieldname varchar(20), isdatetime int,datetimelength int)
    insert into tb values('Ids_ActualData ' , 'sw1' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'sw2' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'ymdhm', 1 , 16)
    insert into tb values('Ids_Configuration' , 'zdID' , 0 , NULL)
    insert into tb values('Ids_Configuration' , 'zdmc' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'yl' , 0 , NULL)
    godeclare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + t.tablename + '.' + t.fieldname + ' ' + t.fieldname +  ',' from (select * from tb where isdatetime = 0) as t
    select @sql = @sql + 'convert(varchar(' + cast(t.datetimelength as varchar) + '),' + tablename + '.' + fieldname + ',120) ' + fieldname + ',' from (select * from tb where isdatetime = 1) as t
    set @sql=left(@sql , len(@sql) - 1)
    print @sql drop table tb/*
    Ids_ActualData .sw1 sw1,Ids_ActualData .sw2 sw2,Ids_Configuration.zdID zdID,Ids_Configuration.zdmc zdmc,Ids_ActualData .yl yl,convert(varchar(16),Ids_ActualData .ymdhm,120) ymdhm
    */ 
      

  4.   

    这个貌似不可以用动态的.或者要用 SP_EXECUTESQL 来执行.
      

  5.   

    declare @str='select * from table1'
    create table #tb () --字段及数据类型和table1的一致
    insert into #tb exec(@sql)DECLARE tempDomainCount CURSOR FOR 
    select * from #tbOPEN tempDomainCount
    FETCH NEXT FROM tempDomainCount INTO @tm,@ip,@domain
    WHILE @@FETCH_STATUS = 0
    begin
    FETCH NEXT FROM tempDomainCount INTO @tm,@ip,@domain
    end
    CLOSE tempDomainCount
    DEALLOCATE tempDomainCount
      

  6.   

    也许这个合适点.认识静态与动态游标背景:静态(STATIC)游标创建将由该游标使用的数据的临时复本。对游标的所有请求都从tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改动态(DYNAMIC) 游标会反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持ABSOLUTE 提取选项。不指定STATIC 关键字的时候, 默认定义的游标是动态(DYNAMIC) 的如果很在意游标的类型, 应该在定义游标的时候, 加上游标类型定义的关键字, 并加上TYPE_WARNING 关键字, 以便在游标类型不是预期的情况下, 收到警告信息 演示:下面的演示针对 STATIC 和DYNAMIC 游标, 显示两者在游标循环期的差异-- 定义演示数据IF OBJECT_ID('tempdb..#tb') IS NOT NULL    DROP TABLE #tbCREATE TABLE #tb(    id int PRIMARY KEY,    col sysname)INSERT #tb(    id, col)SELECT 1, 'AA' UNION ALLSELECT 2, 'BB' UNION ALLSELECT 3, 'CC' UNION ALLSELECT 4, 'DD' -- 游标测试DECLARE CUR_tb CURSOR LOCAL FORWARD_ONLY READ_ONLY TYPE_WARNING DYNAMIC--STATICFOR           SELECT     id, colFROM #tb -- 游标打开前删除记录DELETE TOP (1)FROM #tbWHERE id = 4SELECT 'before cursor open', * FROM #tb -- 打开游标OPEN CUR_tb -- 游标打开后删除记录DELETE TOP (1)FROM #tbWHERE id = 3SELECT 'after cursor open', * FROM #tbFETCH CUR_tbWHILE @@FETCH_STATUS = 0BEGIN    -- 游标循环中删除记录    DELETE TOP (1)    FROM #tb    WHERE id = 2     FETCH CUR_tbENDCLOSE CUR_tbDEALLOCATE CUR_tb本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjcxc/archive/2007/05/12/1606103.aspx