【问题标题】:UNLOAD in interactive SQL within a loop循环内交互式 SQL 中的 UNLOAD
【发布时间】:2015-05-28 02:15:26
【问题描述】:

我不想做以下事情:将大表导出到文件系统以获得数据库的一些响应。

为此,我尝试分块卸载表(参见下面的代码)

我尝试了 Sybase Central - Interactive SQL 中的语句,但它一直抱怨卸载行存在语法错误 (odbc sstatus 42000)

如果我只执行注释行,它会执行我想要的前 1000 行。所以语法本身似乎是正确的。 我错过了什么(或者有没有更简单的方法从运行很长时间的 db 命令中获取反馈?)

CREATE VARIABLE  @max_id INT;
CREATE VARIABLE  @min_id INT;
CREATE VARIABLE  @start_id INT;
CREATE VARIABLE  @end_id INT;
SELECT  @min_id = min(id) , @max_id = max(id) FROM testtable;
SELECT  @start_id = @min_id , @end_id   = @min_id + 1000 ;
//UNLOAD (SELECT * FROM testtable WHERE id BETWEEN @start_id AND @end_id) TO 'c:\temp\test.dat' ENCODING 'UTF8' APPEND ON;

WHILE    @end_id <= @max_id 
BEGIN
    UNLOAD (SELECT * FROM testtable WHERE id BETWEEN @start_id AND @end_id) TO 'c:\temp\test.dat' ENCODING 'UTF8' APPEND ON;
    SELECT  @start_id = @end_id + 1 ;
    SELECT  @end_id   = @end_id + 1000 ;
    MESSAGE convert(varchar, @start_id);
END;

编辑:

WHILE    @end_id <= @max_id LOOP
...
END LOOP;

似乎在交互式 sql 中做我想要的,但我在第一部分的错误是什么?使用循环它不能从外部命令工作(例如调用 BeginExecuteNonQuery)

【问题讨论】:

    标签: while-loop sqlanywhere


    【解决方案1】:
    CREATE VARIABLE  @max_id INT;
    CREATE VARIABLE  @min_id INT;
    CREATE VARIABLE  @start_id INT;
    CREATE VARIABLE  @end_id INT;
    SELECT  @min_id = min(id) , @max_id = max(id) FROM testtable;
    SELECT  @start_id = @min_id , @end_id   = @min_id + 1000 ;
    //UNLOAD (SELECT * FROM testtable WHERE id BETWEEN @start_id AND @end_id) TO 'c:\temp\test.dat' ENCODING 'UTF8' APPEND ON;
    
    WHILE    @end_id <= @max_id Loop
        UNLOAD (SELECT * FROM testtable WHERE id BETWEEN @start_id AND @end_id) TO 'c:\temp\test.dat' ENCODING 'UTF8' APPEND ON;
        SET @start_id = @end_id + 1 ;
        SET @end_id   = @end_id + 1000 ;
    END Loop;
    

    请找到更正后的代码。只是出于好奇,分块卸载背后是否有特定原因?

    【讨论】:

    • 原因是这是一个需要很长时间才能执行的命令(在上面的代码中它是按比例缩小的,考虑一下更复杂的 SELECT 与 JOINS 和几百行在表格中)。为了提供一些反馈,“MESSAGE”用于向客户端发送有关实际状态的信息。
    • 顺便说一句,我的回答是否有帮助。我只是好奇。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2022-11-29
    • 2021-04-07
    • 2016-02-17
    • 2014-11-30
    • 2010-10-18
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多