我正在尝试从我的Sybase数据库中获取行的块(即,每个事务一次获取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任何帮助都将不胜感激。
发布于 2012-08-09 22:13:46
对于数据库程序员来说,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
....发布于 2012-10-12 00:14:35
您可以在sybase中一次读取多个行。使用下面的命令一次获取100行
set cursor rows 100 for cursor_namehttps://stackoverflow.com/questions/11884939
复制相似问题