Tsql Sybase上T-SQL中带游标的多行获取
我正在尝试从Sybase DB中获取行块(即,每个事务一次获取100行) 然而,我已经读到,T-SQL根本不支持这一点 这方面有什么办法吗 此外,如果可以一次获取多行,我如何修改以下代码以实现此目的:Tsql Sybase上T-SQL中带游标的多行获取,tsql,sybase,Tsql,Sybase,我正在尝试从Sybase DB中获取行块(即,每个事务一次获取100行) 然而,我已经读到,T-SQL根本不支持这一点 这方面有什么办法吗 此外,如果可以一次获取多行,我如何修改以下代码以实现此目的: DECLARE my_cursor CURSOR FOR SELECT COL1, COL2, ... COLN FROM MY_DB WHERE SOME_CONDITION_
DECLARE my_cursor CURSOR FOR
SELECT
COL1,
COL2,
...
COLN
FROM
MY_DB
WHERE
SOME_CONDITION_SATISFIED
GO
DECLARE
VAR1 TYPE,
VAR2 TYPE,
...
VARN TYPE
SET NO COUNT ON
OPEN my_cursor
WHILE @@SQLSTATUS = 0
BEGIN
FETCH my_cursor into
@VAR1,
@VAR2,
...
@VARN
END
CLOSE my_cursor
DEALLOCATE CURSOR my_cursor
任何帮助都将不胜感激。对于数据库程序员来说,SQL Server对待游标就像对待Sybase一样,您的代码没有任何问题。在T-SQL中,您基本上无法控制服务器获取物理行以填充光标的速度。但从程序员的角度来看,这并不重要 如果您需要对网络使用进行细粒度控制,那么最好使用其他更适合ETL过程的API,例如SSI 但是,如果您的问题是由于打开的事务而阻止数据库争用,则可以使用
事务隔离级别read uncommitted
(不锁定表)或使用计数器插入一些事务管理逻辑,如下所示:
....
DECLARE @counter INT; SET @counter = 0;
BEGIN TRANSACTION; -- OPEN THE FIRST TRANSACTION
OPEN my_cursor
WHILE @@SQLSTATUS = 0
BEGIN
-- control transactions: commit at every 100 and opens another transaction
IF @counter > 99
BEGIN
SET @counter = 0;
COMMIT TRANSACTION;
BEGIN TRANSACTION;
END
ELSE SET @counter = @counter +1;
FETCH my_cursor into
@VAR1,
@VAR2,
...
@VARN
END
COMMIT TRANSACTION; -- CLOSE THE LAST TRANSACTION
....
您可以在sybase中一次获取多行。使用下面的命令一次获取100行
set cursor rows 100 for cursor_name
在
IF
语句检查中,为什么要在COMMIT TRANSACTION
后面紧跟BEGIN TRANSACTION
?您是否可以继续执行FETCH
语句?整个块的存在是为了防止单个事务变得太大(影响事务日志和数据访问意外事件)。我正在对代码进行一些测试,出现了一个错误。现在我的@@SQLSTATUS
的值一直是2
。您知道如何消除这个值吗?@@SQLSTATUS
在结果集中没有更多数据时返回2,表示所有行都已被处理:[