1

我正在尝试从我的 Sybase DB 中获取行块(即每个事务一次获取 100 行)。

但是,我在这里这里读到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

任何帮助,将不胜感激。

4

2 回答 2

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
....
于 2012-08-09T14:13:46.413 回答
0

您可以在 sybase 中一次获取多行。使用下面一次获取 100 行

set cursor rows 100 for cursor_name
于 2012-10-11T16:14:34.713 回答