8

私は SSIS を初めて使用し、パラメーターを OLE DB ソースに渡すのに問題があります。特定の日付範囲のデータをクエリしたい。

データ型 Date Time の variable1 という 2 つの変数があり、変数の値は expression によって設定されますDATEADD("day", -1, GETDATE())。データ型 Date Time の variable2 であり、変数の値は式によって設定されますDATEADD("day", 0, GETDATE())

OLE DB SOURCE 内では、データ アクセス モードが SQL コマンドに設定されています。以下は SQL コードです。

Select Col1, col2, col3, col4, coldate where Col1 = 'abc' and  coldate between convert(varchar(10), ?, 101) and convert(varchar(10), ?, 101)

パラメータを次のようにマッピングしました

パラメータ0、ユーザー::変数1、入力

パラメータ1、ユーザー::変数2、入力

プレビューを押すと、エラーが発生します

「プレビューの表示中にエラーが発生しました

追加情報: 1 つ以上の必須パラメーターに値が指定されていません。(Microsoft SQL Server ネイティブ クライアント 11.0)」

タスクをデバッグすると、エラーが発生します

[OLE DB ソース [38]] エラー: SSIS エラー コード DTS_E_OLEDBERROR。OLE DB エラーが発生しました。エラー コード: 0x80040E21。OLE DB レコードが利用可能です。ソース: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80040E21 説明: "キャスト仕様の無効な文字値".

注: coldate 列のデータ型は datetime です。

この問題の解決を手伝ってください。OLE DB ソース内の変数からデータ アクセス モードの SQL コマンドを使用して正常にクエリを実行できましたが、データ アクセス モードを SQL コマンドとして使用しないように求められました。ありがとうございました。

4

1 に答える 1

1

変数を正しくマッピングしていることが確実な場合は、次のことをお勧めします。

SSIS は独自のデータ型を使用します。過去に SSIS の datetime を操作する際に問題があったため、SSIS 内から TSQL ステートメントに変数を渡すときはいつでも、文字列のみを操作しようとします (可能な場合)。

SSIS で変数を、フィルター処理しようとしている日付値を受け取る文字列として設定することをお勧めします。dateadd ステートメントを実装するために現在使用しているのと同じステートメント内で、SSIS の文字列への変換を行うことができます。

SSIS 変数式の例:

(DT_STR,4,1252) DatePart("yyyy",dateadd("day", -1, getdate())) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("m", dateadd("day", -1, getdate())),2) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("d", dateadd("day", -1, getdate())),2)  

次に、TSQL ステートメントを次のように単純化します。

Select Col1, col2, col3, col4, coldate 
where Col1 = 'abc' 
and coldate between ? and ?

サイドノート。この方法で TSQL ステートメントを渡す場合。SQL Server は、日付列と between ステートメントを使用する場合、文字列として渡される境界を SQL Server の列型 datetime に変換する必要があることを認識しています。between は、利用可能な場合、適切なインデックスを引き続き使用します。比較のために不適切な型を受け取る他のクエリでの適切なインデックス選択を妨害する可能性のある暗黙的な変換の餌食にはなりません。これは、show execution plan を介して SSMS でテストできます。

于 2014-09-25T06:17:22.283 に答える