游标与exec的问题?
--定义游标
DECLARE abc CURSOR FOR
select * from table1
--下面这样就不行
declare @sql varchar(8000)
set @sql= 'select * from table1 '
DECLARE abc CURSOR FOR
exec(@sql)
请问要将字符串的执行结果作为游标,该如何处理?
------解决方案--------------------首先你要确定你得到的这个结果集是确定的你才能用游标,
你不能让你的游标每次移动的时候你的结果集也是变化的,那你要如何去取值?
declare @sql varchar(8000)
set @sql= 'select 这里写清楚你要取的是那几列 from table1 '
declare @tmp_talbe talbe(字段1 类型,字段2 类型 ...)--根据你要字段建一个临时表
insert into @tmp_table exec(@sql)
DECLARE abc CURSOR FOR @tmp_table
...
------解决方案--------------------游标比较特殊,可以在EXEC()中创建后再引用,通常用于动态游标.可以这样处理:
declare @sql varchar(8000),@table sysname
set @table = 'table1 '
set @sql= 'DECLARE abc CURSOR FOR select * from ' + @table
exec(@sql)
OPEN abc
...
下面是动态游标测试的例子:
if object_id( 'tbTest ') is not null
drop table tbTest
GO
----创建测试数据
create table tbTest(id int,name varchar(10))
insert tbTest
select 1, 'a ' union all
select 2, 'b ' union all
select 3, 'c '
GO
declare @table sysname,@id int,@name varchar(10)
declare @sql varchar(1000)
set @table = 'tbTest '
----定义动态游标
set @sql = 'declare abc CURSOR for select id,name from ' + @table
----创建动态游标
EXEC(@sql)
----打开游标
OPEN abc
FETCH NEXT FROM abc INTO @id,@name
WHILE @@fetch_status = 0
begin
select @id,@name
FETCH NEXT FROM abc INTO @id,@name
end
----清除游标
CLOSE abc
DEALLOCATE abc
----清除测试环境
drop table tbTest
/*结果
----------- ----------
1 a
----------- ----------
2 b
----------- ----------
3 c
*/