Oracle OLE DB プロバイダーの使用中に SQL クエリ パラメーターのマッピングの問題を解決するにはどうすればよいですか?
質問
Oracle OLE DB プロバイダーを使用してパラメーターを含む SQL クエリを入力しようとすると、次のエラーが発生します。
SQL コマンドからパラメータを抽出することはできません。プロバイダーは、コマンドからのパラメーター情報の解析に役立たない場合があります。その場合は、SQL コマンド全体が変数に格納される「変数からの SQL コマンド」アクセス モードを使用してください。
追加情報:
プロバイダーはパラメーター情報を取得できず、SetParameterInfo が呼び出されませんでした。(Oracle 用 Microsoft OLE DB プロバイダー)
ここの提案に従ってみましたが、何が必要なのかよくわかりません。Oracle に対するパラメータ化されたクエリ
何か案は?
解決
質問にあるリンクを展開するには:
- パッケージ変数を作成する
- パッケージ変数名をダブルクリックします。(これにより、変数のプロパティにアクセスできるようになります)
- プロパティ「EvaluateAsExpression」を true に設定します。
- 式ビルダーにクエリを入力します。
- OLE DB ソース クエリを変数からの SQL コマンドに設定します。
式ビルダーは、変数を使用して動的に式を作成し、「パラメータ化されたクエリ」を作成できます。
したがって、次の「通常の」クエリは次のようになります。
select * from book where book.BOOK_ID = ?
式ビルダーでは次のように記述できます。
"select * from book where book.BOOK_ID = " + @[User::BookID]
その後、式ビルダーを使用して null の処理とデータ変換を行うことができます。
他のヒント
データ フロー タスクを使用し、OLE DB ソースを使用し、クエリをパラメータ化する必要がある場合:
- クエリ ステートメントの「完全」を保存する変数を作成します。パッケージの外側の空白領域を右クリックし、「変数」をクリックします。
[変数] ウィンドウで [変数の追加] をクリックします。
名前を付けるのは SQL_DTFLOW_FULL
または簡単に理解できるもの。の variable data type
は STRING
- 変数を作成してパラメータを保存します。
つまり、クエリステートメント全体は次のようになります。
SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter
上記のサンプルでは、パラメータが 1 つだけあります。@BookID なので、パラメータを保存するために変数を 1 つ作成する必要があります。さらに変数を追加するかどうかは、クエリに応じて異なります。
名前を付けてください SQL_DTFLOW_BOOKID
の variable data type
は STRING
したがって、SSIS をきちんと整理し、変数をわかりやすい部分に分類する必要があります。
変数名を次のようにしてみてください SQL_{TASK NAME}_{VariableName}
- 式を作成する
SQL_DTFLOW_FULL
変数の場合は、番号 1 をクリックして、番号 2 の入力を開始します。文字列ブロックを使用して SQL ステートメントを正しい SQL ステートメントにします。通常、最初と最後に「二重引用符」を使用する文字列ブロック。変数を文字列ブロックと連結します。
[式の評価] をクリックして結果を表示し、クエリが正しいことを確認し、クエリ結果を SSMS にコピーして貼り付けます。
独自のロジックを使用して、変数に SQL インジェクションが含まれていないことを自分で確認してください。(開発者の直感を活かしてください)
- データ フロー タスクを開き、項目をダブルクリックして OLE DB ソース エディターを開きます。
- データ アクセス モードを選択します。
SQL Command From Variable
- 変数名を選択します。
SQL_DTFLOW_FULL
- 「プレビュー」をクリックして、機能することを確認します。
以上が、この SSIS 障害ケースを防ぐための私の方法です。私はこの方法を使っているので、SSIS の何かがおかしいので、そのような問題は一度も発生しませんでした。
変数値を変更するには、データ フロー タスクの前に変数値を設定します。 SQL_DTFLOW_FULL
変数の値を変更するたびに、変数も変更されます。
私の場合、問題は SQL 内に /* */ の通常形式のコメントがあり、列のエイリアスも [列名] ではなく「列名」であることでした。
それらを削除すると機能します。
パラメータも試してみてください?ステートメントが JOINS 内ではなく WHERE 句内にある、それも問題の一部でした。