1

ssis コンポーネントの OLE DB コマンド:

insert into D_MAPPING_CLIENTS (ID, DIRECTORY_ID, SOURCE_ID, BASE_ID)
  values (

     case when exists ( select 1 from D_MAPPING_CLIENTS )
           then ( select MAX(ID) + 1 from D_MAPPING_CLIENTS )

         else 1
     end

  , ISNULL(?, 
      case when exists ( select 1 from D_MAPPING_CLIENTS )
             then ( select MAX(DIRECTORY_ID) + 1 from D_MAPPING_CLIENTS )

           else 1
       end ) 

   , ( select ID from D_SOURCES_CLIENTS where SOURCE = 'D:\load\1\clients.txt' )

   , ?)

保存しようとすると、「挿入値リストが列リストと一致しません」というエラーが表示されますが、Management Studio でこのスクリプトを実行すると正常に動作します。

どうしたの?

UPD:最後の「?」を置き換える場所 ある値までは正常に動作します:o

4

1 に答える 1

1

発生している問題は、次の 2 つのいずれかが原因です。SQL 実行タスクでパラメーター マッピングを設定していないか、同じタスクの設定でBypassPrepare設定を設定していない可能性があります。

エラーを再現し、バイパスすることができました。私が従った手順は次のとおりです。

  1. クエリで指定された 2 つのテーブルだけを使用して DB を再作成します。ハードコードされた値でテストして、機能することを確認しました。
  2. パッケージにBaseIDDirectoryIDの 2 つの変数を追加し、いくつかのデフォルト値を設定しました。
  3. SQL 実行タスクを作成し、クエリをSQLStatementに追加しました。
  4. パラメータ マッピングに移動し、パラメータ名0 & 1を指定する 2 つの変数をマッピングしました。この時点で、私のBypassPrepareオプションはFalseに設定されており、タスクを実行すると、受け取った正確なエラーが発生しました。
  5. BypassPrepareオプションをTrueに設定します。タスクの実行は成功し、問題なく DB に行が追加されました。

この特定のプロパティ (別のコンテキストで使用されますが、一般的な機能は同じです) の詳細については、http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.executesqltask.executesqltask を参照してください。バイパス準備.aspx


アップデート

与えられた解決策は、OLE DB コマンドではなく、SQL 実行タスク用です。「?」の位置の変更 OP で述べられているように、SQL クエリの値パラメータを先頭に配置すると、この問題が回避されます。

もう 1 つのオプションは、ストアド プロシージャの呼び出しにフォールバックすることです。

于 2012-11-02T11:39:26.970 に答える