2017-06-15 12 views
0

大きな親テーブルから小さなテーブルを作成するスクリプトを作成しようとしています。 (私はこの場合は選択肢がありません)しかし、深刻なSQLの仕事をしなければならなかったので、しばらくしてきました。おそらく何か愚かなものに悩まされています...これは最初のカップル爆発せずに行を。変数を割り当てるMySqlエラー

DELIMITER $$ 
BEGIN 
SET @I = 1; 
SET @CountCol = 'Item Number'; 
SET @StartPos = 0; 
SET @EndPos = 24999; 
SET @TotalCount = (SELECT Count(@CountCol) FROM `All_Info`); 
SET @HowMany = CEILING(@TotalCount/25000) + 1; 

WHILE @I < @HowMany DO 
    SET @query = CONCAT('CREATE TABLE All_Info_',@I,' AS (SELECT @n := @n + 1 `id`, * FROM All_Info LIMIT ',@StartPos,',',@EndPos,'),PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;)'); 
    PREPARE stmt from @query; 
    EXECUTE stmt; 

    SET @I = @I + 1; 
    SET @StartPos = @EndPos; 
    SET @EndPos = @EndPos + 25000; 
END WHILE; 
END$$ 

私が手にエラーがある:

[クエリ1でERROR]あなたのSQL構文でエラーが発生しています。あなたのMySQLサーバのバージョンに対応するマニュアルを調べて、正しい構文が2行目の 'SET @I = 1'の近くで使用するようにしてください。

私は狂った薬を飲んでいるようです。私が間違っていることは何ですか?

(注:何とか関連性がある場合には、私のクライアントとして続編Proを使用して)、

+0

あなたは潜在的なセミコロンの問題だと思いますか? – JoshKopen

+0

私はそれが間違いなく停止しているにもかかわらず、私には分かりません。私はそれを理解できません。 – tobybot

答えて

0

私の答えいつものように、明白なものだった:ストアドプロシージャの外WHILEループを行うことはできません。うわー。

プロシージャにこれを配置し、それを呼び出すと私の不幸が解決されました。私はエンジンとデフォルトの文字セットも削除しなければなりませんでした。単純化されたビット。今は素晴らしい作品です。

DROP PROCEDURE IF EXISTS TableSplitTemp; 
DELIMITER ;; 
create procedure TableSplitTemp() 
BEGIN 
SET @I = 1; 
SET @CountCol = 'Item Number'; 
SET @StartPos = 0; 
SET @EndPos = 24999; 
SET @TotalCount = (SELECT Count(@CountCol) FROM `All_Info`); 
SET @HowMany = CEILING(@TotalCount/25000) + 1; 
WHILE @I < @HowMany DO 
    SET @query = CONCAT('CREATE TABLE All_Info_',@I,' AS (SELECT * FROM All_Info LIMIT ',@StartPos,', ',@EndPos,');'); 
    PREPARE stmt from @query; 
    EXECUTE stmt; 

    SET @I = @I + 1; 
    SET @StartPos = @EndPos; 
    SET @EndPos = @EndPos + 25000; 
END WHILE; 
END;; 
delimiter ; 
/* call TableSplitTemp(); ta-daa it works! */ 
関連する問題