2015-05-18 1 views
0

i wan't сделать следующее: Экспорт большой таблицы в файловую систему, получая некоторый отклик от db.РАЗГРУЗИТЬ в интерактивном SQL в цикле

Для этого я пытался выгрузить таблицу на кусках (см код ниже)

Я попытался заявление в Sybase Central - Interactive SQL и продолжает жаловаться, что есть ошибка синтаксиса в разгрузочной линии (Odbc sstatus 42000)

Если я выполняю только прокомментированную строку, она делает то, что я хочу для первых 1000 строк. Поэтому сам синтаксис кажется правильным. Что мне не хватает (или есть более простой способ, чтобы получить обратную связь от команды очень долго работает дб?)

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; 

EDIT:

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

, кажется, делать то, что я хочу в интерактивный sql, но что я - ошибка в первой части? с циклом он не работает из внешней команды (например, при вызове BeginExecuteNonQuery)

ответ

0
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; 

Скорректированный код. Просто из любопытства, есть ли конкретная причина разгрузки в куске?

+0

Причина в том, что это команда, которая займет много времени (в приведенном выше коде она уменьшена, подумайте о немного более сложном SELECT с JOINS и несколькими hunderthousend линиями в таблицах). Чтобы дать некоторую обратную связь, «СООБЩЕНИЕ» используется для отправки информации о фактическом состоянии клиенту. – Offler

Смежные вопросы