SQL 服务器游标需要在打开时而不是在声明时设置参数
SQL Server cursor needs to set the args upon open and not on declaration
我有一个用 Sybase 编写的旧程序,我需要将它迁移到 SQL 服务器。我面临的问题之一是,在 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
打开游标后,我需要查询来检索编号为 20 而不是 10 的 trx。
一个@table变量或#temp table来存储@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;
我有一个用 Sybase 编写的旧程序,我需要将它迁移到 SQL 服务器。我面临的问题之一是,在 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
打开游标后,我需要查询来检索编号为 20 而不是 10 的 trx。
一个@table变量或#temp table来存储@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;