如题,提示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