日期:2014-05-18  浏览次数:20458 次

游标与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
*/