首页 > 解决方案 > SQL Server 游标需要在打开而不是声明时设置参数

问题描述

我有一个在 Sybase 上编写的旧程序,我需要将它迁移到 SQL Server。我面临的一个问题是,在 Sybase 中,我们通常使用变量来编写游标的声明。并且这个变量将在游标定义之后,但在打开游标之前设置。因此,当光标打开时,查询将基于声明后设置的这些变量的值。

示例游标CTSTRS_ACCDET基于 trs_no。

select @AL_TRSNO=10
    DECLARE CTSTRS_ACCDET CURSOR FOR
    SELECT  AC_BR,
            AC_CY,
            AC_GL,
            AC_CIF,
            AC_SL,
            FC_AMOUNT
    FROM CTSTRS_ACC_DET
    WHERE 
     AND TRS_NO = @AL_TRSNO
    FOR READ ONLY
select @AL_TRSNO=20

当光标打开时,我需要查询来检索 trx no 20 而不是 10。

标签: sqlsql-servercursorsybase

解决方案


一个@table 变量或#temp 表来存储@AL_TRSNO 的值和从@table/#table 中选择的游标:

declare @o int;
declare @t table(val int);

set @o = 22;
insert into @t(val) values(@o);

declare c cursor dynamic for
select name, object_id
from sys.all_columns
where object_id = (select max(val) from @t);

open c;
fetch next from c;
close c;

set @o = 19;
delete from @t;
insert into @t(val) values(@o);

open c;
fetch next from c;
close c;

deallocate c;

推荐阅读