1

MySQL データ テーブルからデータをロードしています。テーブルには大きなテキスト列があり、レコード数が 15,000 を超えると SSIS 接続がタイムアウトします。そこで、データをブロック単位で持ち込んでみようと思いました。ソース テーブルからレコード数を取得するクエリを作成し、すべてのレコードが計算されるまで、開始レコード番号と終了レコード番号を含むオブジェクトを作成しました。次に、データを読み取るための For-Each コントロールを設定しました。式を使用してクエリを定義すると、必要な開始レコード番号と終了レコード番号を含むクエリが作成されます。式を評価して MySQL に貼り付けると、意図したとおりに機能します。

クエリで MySQL 変数を使用する必要があるという事実を除いて、すべてが素晴らしいでしょう。変数名は引用符で囲まれていますが、SSIS が実際にクエリを実行しようとすると、パラメーター@curRowを定義する必要があるが、その変数は MySQL で使用するためのものであることがわかります。これを回避する方法はありますか?最初に考えたのは、という名前のパッケージに文字列変数を作成することでしたcurRow

私が使用している表現は次のとおりです。

"SELECT id,
        report_html,
        CASE
          WHEN `TimeStamp` < '1900-01-01 00:00:00'
            OR `TimeStamp` IS NULL THEN
                 CAST('1900-01-01' AS DATETIME)
          ELSE `TimeStamp`
        END AS `TIMESTAMP`,
        @curRow := @curRow + 1 AS row_number
 FROM   corp_inv, (SELECT @curRow := 0) AS r
 HAVING row_number BETWEEN " + (DT_STR, 6, 1252) @[User::LoVal]  + "
                       AND " + (DT_STR, 6, 1252) @[User::HiVal]  + ";"

式によって作成されたクエリ (MySQL で 3,999 レコードを取得します) は次のとおりです。

SELECT id,
       report_html,
       CASE
         WHEN `TimeStamp` < '1900-01-01 00:00:00'
           OR `TimeStamp` IS NULL THEN
                CAST('1900-01-01' AS DATETIME)
         ELSE `TimeStamp`
       END AS `TIMESTAMP`,
       @curRow := @curRow + 1 AS row_number
FROM   corp_inv, (SELECT @curRow := 0) AS r
HAVING row_number BETWEEN 1
                      AND 3999;
4

1 に答える 1

1

このSO投稿は追加を提案します

;Allow User Variables=True

接続文字列に。

(すべての可能なプロパティについては、.Net接続文字列に関するMySQLのドキュメントも確認してください。)

もう1つの提案は、スクリプトコンポーネントソースを使用して純粋な.NETに移行し、MySQL変数の使用を妨げているあらゆる問題を回避することです。

于 2013-01-17T21:18:20.403 に答える