none
游标中如何实现 动态select命令? RRS feed

  • 问题

  • declare my_cursor cursor for select * from listA where a=1

    open my_cursor... ...

    这段游标查询中,如果命令是不确定的,有可能是如上所述粗体的查询命令,也有可能是 select * from listA where b=1, 需要在程序中作出判断。

    如果按照动态SQL命令我是如下编写:

    declare @cmd nvarchar(max)=''

    if (...)set @cmd ='select * from listA where a=@index'

       else set @cmd ='select * from listA where b=@index'

    declare my_cursor cursor for (exec SP_EXECUTESQL @cmd ,N'@index nvarchar(max)','1')

    open my_cursor... ...

    这样显然是行不通的,

    那么该如何编写呢?

    2013年6月8日 6:12

答案

  • 可以用游标变量, 参考:

    declare @cmd nvarchar(max)=''
    if (...)set @cmd ='select * from listA where a=@index'
       else set @cmd ='select * from listA where b=@index'
    DECLARE
    	@cur CURSOR;,
    	@sql nvarchar(max)
    ;
    SET @sql = N'SET @cur = CURSOR FOR ' + @cmd + N'; OPEN @cur;';
    EXEC sp_executesql
    	@sql,
    	N'@cur CURSOR OUTPUT',
    	@cur OUTPUT
    ;
    FETCH @cur;
    CLOSE @cur;

    2013年6月8日 7:06
  • DECLARE @cmd NVARCHAR(MAX)
    DECLARE @index INT
    SET @index=1
    IF ( 1 = 1 ) 
        BEGIN 
            SET @cmd = 'select * from listA  where a='+CAST(@index AS NVARCHAR(100)) 
        END
    ELSE 
        BEGIN
            SET @cmd = 'select * from listA  where b='+CAST(@index AS NVARCHAR(100))
        END
    DECLARE @cur CURSOR
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = N'SET @cur = CURSOR FOR ' + @cmd + N'; OPEN @cur;';
    EXEC sp_executesql @sql, N'@cur CURSOR OUTPUT', @cur OUTPUT;
    FETCH @cur;
    CLOSE @cur;


    给我写信: QQ我:点击这里给我发消息

    2013年6月8日 13:51

全部回复

  • 可以用游标变量, 参考:

    declare @cmd nvarchar(max)=''
    if (...)set @cmd ='select * from listA where a=@index'
       else set @cmd ='select * from listA where b=@index'
    DECLARE
    	@cur CURSOR;,
    	@sql nvarchar(max)
    ;
    SET @sql = N'SET @cur = CURSOR FOR ' + @cmd + N'; OPEN @cur;';
    EXEC sp_executesql
    	@sql,
    	N'@cur CURSOR OUTPUT',
    	@cur OUTPUT
    ;
    FETCH @cur;
    CLOSE @cur;

    2013年6月8日 7:06
  • DECLARE @cmd NVARCHAR(MAX)
    DECLARE @index INT
    SET @index=1
    IF ( 1 = 1 ) 
        BEGIN 
            SET @cmd = 'select * from listA  where a='+CAST(@index AS NVARCHAR(100)) 
        END
    ELSE 
        BEGIN
            SET @cmd = 'select * from listA  where b='+CAST(@index AS NVARCHAR(100))
        END
    DECLARE @cur CURSOR
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = N'SET @cur = CURSOR FOR ' + @cmd + N'; OPEN @cur;';
    EXEC sp_executesql @sql, N'@cur CURSOR OUTPUT', @cur OUTPUT;
    FETCH @cur;
    CLOSE @cur;


    给我写信: QQ我:点击这里给我发消息

    2013年6月8日 13:51