質問

MSSQLからMySQLへの移行を試みています。このストアドプロシージャは、永続テーブルから一部の列の一時テーブルを作成し、カーソルを使用して各レコードのRandNum列を乱数で更新し、データセットを選択します。これを書いているとき、私はカーソルをバイパスして、ただ......

SELECT Id, Title, DateStart, Rand() FROM cms_News;

しかし、私は今、DBを変換しようとしているだけなので、あまり劇的なものを変更したくありません。後で戻ってこの機能を最適化します。 SPは次のとおりです。編集:この例から、エラーとは関係のないコードをすべて削除しました。また、今日これをオンラインで見ましたが、私はこの問題を抱えているのはこの人だけではありません。 MySQLは、カーソル宣言の構文を好みません。アイデアはありますか?

DELIMITER ;//

DROP PROCEDURE IF EXISTS `cms_NewsSelectMainPageNews`;//
CREATE PROCEDURE `cms_NewsSelectMainPageNews`
()
BEGIN
  CREATE TEMPORARY TABLE tempNews
  (
    Id int NOT NULL, 
    Title nvarchar(250),
    DateStart datetime,
    RandNum float NULL
  );

  DECLARE Randomizer CURSOR
      FOR SELECT Id FROM tempNews;
END;//
役に立ちましたか?

解決

  REPEAT
    FETCH Randomizer INTO cursor_id;
    IF NOT done THEN
      UPDATE tempNews SET RandNum = rand();
       WHERE id = @cursor_id;
    END IF;
  UNTIL done END REPEAT;

プロシージャで宣言された変数 cursor_id

ではなく、ユニット化されたセッション変数 @cursor_id を使用しています

次のように書き換えます:

  REPEAT
    FETCH Randomizer INTO cursor_id;
    IF NOT done THEN
      UPDATE tempNews SET RandNum = rand();
       WHERE id = cursor_id;
    END IF;
  UNTIL done END REPEAT;

さらに良いことに、最初に提案したように、一時テーブルを削除するだけです。


このステートメントについて:

  

しかし、私は今、DBを変換しようとしているだけなので、あまり劇的なものを変更したくありません。後で戻ってこの機能を最適化します。

SQL Server MySQL 非常に異なるプラットフォームです。

切り替えることに決めたとき、あなたはすでにすべてをあまりにも劇的に変更しました。

ほとんどの場合、古いコードをコピーして MySQL にたたき込むことはできません。

少なくとも同じプラットフォームのバージョン間で何らかの互換性を維持しようとする試みがあるため、 SQL Server のいくつかのバージョン間で動作する可能性がありますが、 MySQL

コードのすべての部分を取得し、可能な限り単純で予測可能なメソッドを使用して、古いコードと同じ結果を生成することを確認します。

あなたの場合、 @cursor_id 変数はコードの初期段階で初期化され、その値はストアドプロシージャで使用される可能性があり、予期しない動作が発生する可能性があります。

これは、 SQL Server では変数にバッチスコープがあり、 MySQL ではセッションスコープがあるためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top