create proc myproc 
  @sqltxt varchar(1024)
as
 ............
exec('Declare curName cursor for '+@sqltxt+'
     open curName
     Fetch Next from curName into .......
     .......... ')

解决方案 »

  1.   

    不行吧? 
    二楼将所有的CURSOR部分均变成EXEC的一个参数,这样我怎么Fetch 到自己的变量?我的应用是这样的:
    1。存储过程通过参数接受查询条件,然后我对表的固定字段 通过 传入的条件进行查询。
    比如:  
    存在表 t_tab(col1,col2,col3)
    存在需要编写的存储过程 myproc(@sqlwhere)
    调用 myproc('col2 = ''1'' and col3=''3''  ')那么,myproc该如何写呢?
    如下是一个框架:
    create PROCEDURE myproc 
          (@sqltxt varchar(1024)
           )
    as
    begin
        DECLARE @aaa varchar(100)
        DECLARE @bbb varchar(100)
        DECLARE @ccc varchar(100)    DECLARE myCur CURSOR FOR 
           Select col1,col2,col3
              From t_tab
        --------------------------请问在此处如何加上通过参数传入的条件???????????????       
       OPEN myCur 
       FETCH NEXT FROM myCur INTO @aaaa,@bbbb,@cccc
       WHILE (@@FETCH_STATUS = 0 )
       BEGIN
           ...........
            FETCH NEXT FROM myCur INTO @aaaa,@bbbb,@cccc
       END
       CLOSE myCur
     .....
    end
      

  2.   

    哦,谢谢 阿来。
    再问一个 很初浅的问题:
    在存储过程中,我执行了一个select语句。或exec (' select col1 col2 from t_tab ')
    此时,在该语句后面如何取得其select出来的结果?
      

  3.   

    如果有多行,就通过cursor,如果一行直接赋值
      

  4.   

    多行阿,就是接着你刚才的思路: 
    。存储过程通过参数接受查询条件,然后我对表的固定字段 通过 传入的条件进行查询。
    比如:  
    存在表 t_tab(col1,col2,col3)
    存在需要编写的存储过程 myproc(@sqlwhere)
    调用 myproc('col2 = ''1'' and col3=''3''  ')那么,myproc该如何写呢?
    如下是一个框架:
    create PROCEDURE myproc 
          (@sqltxt varchar(1024)
           )
    as
    begin
        DECLARE @aaa varchar(100)
        DECLARE @bbb varchar(100)
        DECLARE @ccc varchar(100)
         
        DECLARE @mysql varchar(1024)
       
        Set @mysql = ' select col1,col2,col3 from t_tab where ' + @sqltxt     接下来,如何做呢?
        如果Exec (@mysql) 那么如何取得@mysql select出来的结果?
        或者,有其他什么办法吗?
    end
      

  5.   

    --例Create PROCEDURE myproc 
     @sqltxt nvarchar(1024) 
    as 
        DECLARE @aaa varchar(100)
        DECLARE @bbb varchar(100)
        DECLARE @ccc varchar(100)
        declare @sqlstr nvarchar(400)   set @sqlstr=N'
        DECLARE myCur CURSOR FOR 
        Select col1,col2,col3 From t_tab'+@sqltxt+'     
       OPEN myCur 
       FETCH NEXT FROM myCur INTO @aaaa,@bbbb,@cccc
       WHILE (@@FETCH_STATUS = 0 )
       BEGIN
           ...........
            FETCH NEXT FROM myCur INTO @aaaa,@bbbb,@cccc
       END
       CLOSE myCur
       Deallocate mycur'EXEC sp_executesql @sqlstr,
         N'@aaaa varchar(100), @bbbb varchar(100), @cccc varchar(100)',
         @aaaa, @bbbb, @cccc  
       
     .....
    go
      

  6.   

    报错:
    服务器: 消息 214,级别 16,状态 2,过程 sp_executesql,行 49
    过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
      

  7.   

    我没有使用过 @statement 这个变量!
      

  8.   

    EXEC 可以啊,见意看看联机帮助!
      

  9.   

    在master库中执行Create PROCEDURE dbo.TestProc_xuxf3
    AS
    DECLARE @sqltxt varchar(2048)
    DECLARE @aaa varchar(10)
    set @aaa = 'A  '
    set @sqltxt = N' select name from spt_values where type = @aaa '
    EXEC sp_executesql @sqltxt,
    N'@aaa varchar(10)',
    @aaa
    RETURN 然后运行看看。
      

  10.   

    --稍改你的一下:Create PROCEDURE dbo.TestProc_xuxf3
    AS
    DECLARE @sqltxt varchar(2048)
    DECLARE @aaa varchar(10)
    set @aaa = '''A'''
    set @sqltxt = N' select name from spt_values where type = @aaa '
    EXEC sp_executesql @sqltxt,
    N'@aaa varchar(10)',
    @aaa
    go--有什么问题呢?
      

  11.   

    可以换一种思路,传一个table更好处理一点吧 ,不过没有试过
      

  12.   

    找到了 :) 是DECLARE @sqltxt varchar(2048) 需要改变为:
    DECLARE @sqltxt nvarchar(2048)
      

  13.   

    alter PROCEDURE dbo.TestProc_xuxf3
    AS
    DECLARE @sqltxt nvarchar(4000) --请申明为nvarchar
    DECLARE @aaa  varchar(10)
    set @aaa = '''A'''
    set @sqltxt = ' select * from medicaltypedict where medicaltypename = @aaa '
    EXEC sp_executesql @sqltxt,
    N'@aaa varchar(10)',
     @aaa
    go