我正在尝试从Sybase DB中获取行块(即每次事务一次获取100行)。
但是,我已阅读here和here,但T-SQL根本不支持这一点。
有没有解决这个问题?
此外,如果一次可以获取多行,我怎么能修改以下代码来执行此操作:
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
任何帮助都将不胜感激。
答案 0 :(得分:2)
对于数据库程序员,SQL Server像Sybase一样处理游标,并且您的代码没有任何问题。在T-SQL中,您基本上无法控制服务器获取物理行以填充光标的速度。但从程序员的角度来看,它并不重要。
如果您需要对网络使用情况进行细粒度控制,则最好使用其他更适合ETL过程的API,例如SSIS。
如果您的问题是由于打开事务而阻止数据库争用,您可以使用transaction isollation level 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
....
答案 1 :(得分:0)
您可以在sybase中获取多行。使用下面的方法一次获取100行
set cursor rows 100 for cursor_name