首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sybase上T-SQL中使用游标的多行读取

Sybase上T-SQL中使用游标的多行读取
EN

Stack Overflow用户
提问于 2012-08-09 21:48:47
回答 2查看 7.1K关注 0票数 1

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

然而,我读过herehere,T-SQL根本不支持这一点。

有什么办法可以解决这个问题吗?

另外,如果可以一次提取多个行,我如何修改以下代码来实现此目的:

代码语言:javascript
运行
复制
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

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-09 22:13:46

对于数据库程序员来说,SQL Server对待游标就像对待Sybase一样,您的代码没有任何问题。在T-SQL中,您基本上无法控制服务器获取物理行以填充游标的速度。但从程序员的角度来看,这并不重要。

如果需要对网络使用进行这种细粒度的控制,最好使用其他更适合ETL流程的API,比如SSIS。

但是,如果您的问题是防止因打开的事务而引起的数据库争用,则可以使用transaction isollation level read uncommitted (不锁定表)或插入一些带有计数器的事务管理逻辑,如下所示:

代码语言:javascript
运行
复制
....
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
....
票数 2
EN

Stack Overflow用户

发布于 2012-10-12 00:14:35

您可以在sybase中一次读取多个行。使用下面的命令一次获取100行

代码语言:javascript
运行
复制
set cursor rows 100 for cursor_name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11884939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档