create procedure procTest1
    @field_name nvarchar(20),
    @value nvarchar(20),
    @where_name nvarchar(20),
    @tbl_name nvarchar(30),
    @curOut cursor varying output
as 
    declare @str varchar(1000)
    select @str='select '+@field_name+' from '+@tbl_name+
                             ' where '+@where_name+'='+@value
    set @curOut=cursor for @str
    open @curOut
go--我想返回一个游标.而我又想用动态Sql.怎么写?

解决方案 »

  1.   

    exec('declare c1 cursor for select '+@field_name+' from '+@tbl_name+ ' where '+
    @where_name+'='+@value)
    open c1
    fetch next from c1 into ...
      

  2.   

    那我想存储过程output一个游标.怎么做?
      

  3.   

    create procedure procTest1
    @field_name nvarchar(20),
    @value nvarchar(20),
    @where_name nvarchar(20),
    @tbl_name nvarchar(30),
    @curOut cursor varying output
    as
    --declare @str varchar(1000)
    declare @str nvarchar(2000)
    --select @str='select '+@field_name+' from '+@tbl_name+' where '+@where_name+'='+@value
    select @str=N'set @curOut = cursor for select '+@field_name+N' from '+@tbl_name+N' where '+@where_name+N'='+@value+char(10)+N'open @curOut'
    exec sp_executesql @sql, N'@curOut cursor output', @curOut output
    --set @curOut=cursor for @str
    --open @curOut
    go
      

  4.   

    可以试一下用SQL里面自带的游标存储过程 sp_describe_cursor_columns
      

  5.   

    output  游标 干什么?
      

  6.   

    Limpire(昨夜小楼) 
    不行哦.我试了你的代码.
    我调用时出现了这些错误服务器: 消息 206,级别 16,状态 2,过程 procTest1,行 0
    操作数类型冲突: cursor 与 nvarchar 不兼容
    服务器: 消息 16950,级别 16,状态 2,行 9
    当前没有为变量 '@cur' 分配游标。
    服务器: 消息 16950,级别 16,状态 2,行 15
    当前没有为变量 '@cur' 分配游标。
    服务器: 消息 16950,级别 16,状态 2,行 16
    当前没有为变量 '@cur' 分配游标。
      

  7.   

    /*
    怎么可能不行
    */create procedure procTest1
    @field_name nvarchar(20)='name',
    @value nvarchar(20)=1,
    @where_name nvarchar(20)='id',
    @tbl_name nvarchar(30)='sysobjects',
    @curOut cursor varying output
    as
    --declare @str varchar(1000)
    declare @str nvarchar(2000)
    --select @str='select '+@field_name+' from '+@tbl_name+' where '+@where_name+'='+@value
    select @str=N'set @curOut = cursor for select '+@field_name+N' from '+@tbl_name+N' where '+@where_name+N'='+@value+char(10)+N'open @curOut'
    exec sp_executesql @str, N'@curOut cursor output', @curOut output
    --set @curOut=cursor for @str
    --open @curOut
    go
    declare @curOut cursor
    exec procTest1 @curOut=@curOut output
    fetch next from @curOut
    close @curOut
    deallocate @curOut
    /*
    name
    ---------
    sysobjects
    */drop procedure procTest1
      

  8.   

    为何游标一定要先打开(open)再返回呢? 如果返回后再打开(open), 却会报错, 什么原因?
      

  9.   

    我记得如果C#里调用SQL Server存储过程,好像是可以直接返回数据集的