当前位置: 代码迷 >> Sql Server >> 使用动态游标揭示游标不存在
  详细解决方案

使用动态游标揭示游标不存在

热度:68   发布时间:2016-04-24 09:12:58.0
使用动态游标提示游标不存在
本帖最后由 u010218033 于 2015-04-13 17:30:44 编辑
如题,提示c_tmp游标不存在

declare @sql nvarchar(100)
declare @TableNo int 
declare @srvTableName varchar(100)
declare @DstTableName varchar(100)
set @srvTableName = 'tb_1'
set @DstTableName = 'tmp_sp_1'
set @sql = 'declare c_tmp cursor for' + CHAR(13)
set @TableNo = 1
set @sql = @sql + ' select distinct TableNo from  ' + @SrvTableName
exec sp_executesql @sql
open c_tmp
Fetch next from c_tmp into @TableNo
while(@@FETCH_STATUS = 0)
begin
exec ('insert into  ' + @DstTableName + ' select * from  ' + @SrvTableName + '  where TableNo = ''' + @TableNo+ '''')
Fetch next from c_tmp into @TableNo
end
close c_tmp 
deallocate c_tmp 

------解决思路----------------------
exec?sp_executesql?@sql

 上面这句,执行完了,动态的 c_tmp 也就过期了。
------解决思路----------------------
把后面的一起动态 ,EXEC 都是另起了一个连接
------解决思路----------------------

-- 我给你改了改,这个能跑通,你把最后的 print 改成 exec 
declare 
@sql varchar(8000),
@SrvTableName varchar(60) = 'TA',
@DstTableName varchar(60) = 'TB'

set @sql = ' declare @No varchar(10) '
set @sql = @sql + ' declare c_tmp cursor for select distinct TableNo from ' + @SrvTableName
set @sql = @sql + ' open c_tmp '
set @sql = @sql + ' Fetch next from c_tmp into @No ' 
set @sql = @sql + ' while(@@FETCH_STATUS = 0) '
set @sql = @sql + ' begin '
set @sql = @sql + ' exec(''insert into ' + @DstTableName + ' select * from ' + @SrvTableName +' where ExRoadID = '' +  @No) '
set @sql = @sql + ' Fetch next from c_tmp into @No ' 
set @sql = @sql + ' end '
set @sql = @sql + ' close c_tmp'
set @sql = @sql + ' deallocate c_tmp'
print @sql
go
  相关解决方案