1

クライアント用にいくつかのソフトウェアのデモをセットアップしようとしていますが、そのためにはライブレポートデータが必要です。これは、販売注文と購入注文があるERPタイプのシステムに通常存在する情報(およびそれらを構築するためのすべてのデータ)に依存するビジネスソフトウェアです。

私はサンプルのERPデータベースを長く懸命に探しましたが、思いついたのはMSAdventureWorksDBのMySQLポートだけでした。これは素晴らしく、サンプリングに使用できるデータがたくさんあります。

問題は、注文のすべての日付が2001年から2004年までであるということです。

私がやりたいのは、AdventureWorksDB全体のすべての日時フィールドをループして10年を追加する単純なMySQLスクリプトを作成することです。これにより、日付範囲(2011〜2014)が作成され、はるかに合理的になります。

借りることができると思った非常によく似たスクリプトを含むこの投稿を見つけましたが、何らかの理由でMySQLに移植できないようです。

私はそれをこの小さなコードに要約しました。何らかの理由で、私のMySQLはWHILEループを実行しません-そして私はその理由がわかりません。

USE adventureworks;

CREATE TEMPORARY TABLE ColumnList 
       (
      TableName NVARCHAR (100),
      columnName NVARCHAR (100)
       );


INSERT INTO ColumnList
        select t.table_name,c.column_name
        from information_schema.tables t inner join information_schema.columns c on t.table_name=c.table_name
        where c.column_type = 'datetime';

SET @Counter = 1;
SET @TotalCount = (SELECT COUNT(*) FROM ColumnList C);

BEGIN
    -- do stuff here
    @Counter = @Counter + 1;
END
END WHILE;

出てくるエラー:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHILE @Counter <= @TotalCount DO
BEGIN
  -- do stuff here
END
END WHILE' at line 1

どんな助けでもいただければ幸いです。

最終更新 *以下の答えは正しかったのですが、これが答えを探しているところに出くわした場合、MySQLで動的SQLを構築できなかったため、プリペアドステートメントなどで非常に複雑にならなければ見つけることができませんでした。私はそれを処理するためにCodeIgniterアプリ内にこの小さなスクリプトを書くことになりました。

それが将来の誰かに役立つことを願っています:

$this->load->database();    

$sql = "select t.table_name,c.column_name
from information_schema.tables t inner join information_schema.columns c on t.table_name=c.table_name
where c.table_schema='adventureworks' and c.column_type = 'datetime';";

$columnlist = $this->db->query($sql);

foreach ($columnlist->result_array() as $row) 
{
  //Now you have list of columns and tables, need to go in to each table, get all
  //results and update
  $column = $row['column_name'];
  $table = $row['table_name'];

  $sql = 
    "select distinct $column as 'thisdate', DATE_ADD($column, INTERVAL 10 YEAR) as 'newdate'
    from $table";

  $valuelist = $this->db->query($sql);
  $results = $valuelist->result_array();

  foreach ($results as $value) 
  {        
    $thisdate = date ("Y-m-d H:i:s", strtotime($value['thisdate']));
    $newdate = date ("Y-m-d H:i:s", strtotime($value['newdate']));

    $updatestmt =
      'update '.$table.' set '.$column." = '". $newdate ."' where $column = '".$thisdate."'";

    echo $updatestmt;
    $this->db->query($updatestmt);
    echo ' -- rows affected '.$this->db->affected_rows().'<br/>'; 
  }
}
4

3 に答える 3

2

whileループは、ストアドプロシージャ、関数、またはトリガーでのみ使用できます。
コードスニペットは、そのようなspまたはトリガーの一部ではないようです。
したがって、エラーです。

詳細については、 WHILE構文を参照してください。

于 2012-07-18T16:38:51.163 に答える
0

おそらく、BEGIN ENDの後に区切り文字を追加しますか?

WHILE @Counter <= @TotalCount DO
    BEGIN
      -- do stuff here
    END;
END WHILE;

次に、@counterをインクリメントすることを忘れないでください。

于 2012-07-18T16:38:23.403 に答える
0
UPDATE mytable SET mydate = DATE_ADD(mydate, INTERVAL 10 YEAR)
于 2012-07-18T16:29:46.373 に答える