web-dev-qa-db-ja.com

SQLサーバーにWebサービスデータを取り込む

ホストされているWebサービスから毎日データセットを取得する必要があります。 SSISパッケージでXMLの「列名」を取得できます。しかし、データセットのすべてのデータをcsv形式で取得するか、SQL Serverに直接取り込む必要があります。 (行と列、ヘッダーデータとデータセット)。

これはSSISで実現可能ですか?または、より良いアプローチはありますか?ご意見やアドバイスは大歓迎です。

4
William M Low

これはSSISを使用して行う必要がありますか?その場合は、スクリプトタスク(C#またはVB.NET)でほぼ何でも実行できます。これにより、データをSSIS変数に直接取り込み、パッケージ全体で使用できます。

または、SQLCLRを介してこれを行うことができます。その場合、T-SQLから直接呼び出すことができます。これにより、ストアドプロシージャ、SQLエージェントジョブなどに簡単に統合できます。SSISのSQLタスクで呼び出すこともできます。ただし、SSISでスクリプトタスクを使用するのではなく、SQLCLRを使用する場合は少し注意する必要があります。 Stack Overflowのいくつかの回答で検討すべきいくつかの事項を文書化しました。

これらの回答から最も重要な点は次のとおりです。

  • 次のMSDNページをご覧ください。

  • URL /クエリ文字列をエスケープするには:
    • SQL Server 2005、2008、または2008 R2を使用している場合は、.- NET Framework v4.5より前に利用可能だった ri.EscapeDataString を使用します。
    • SQL Server 2012、2014以降を使用している場合は、Uri.EscapeDataStringを使用できます。サーバーが少なくとも.NET Framework v4.5に更新されている場合は、代わりに WebUtility。 UrlEncode
  • まだ行っていない場合は、サーバーレベルで「CLR統合」を有効にする(一度だけ)必要があります。 CLR統合を有効にする
  • SQLCLRは「共有」コードです。 DBと所有者の組み合わせごとに1つのアプリドメインがあります。したがって、このコードを呼び出すすべてのセッションは同じアプリドメインで動作します。同じURIに対して複数の同時リクエストが行われた場合、ServicePointManager( ServicePointManager.DefaultConnectionLimit )によって課される同時接続制限に拘束されるため、最初の2つを除くすべてが「保留中」になる可能性があります。そして、デフォルトの制限はなんと2!つまり、そのURIへのすべての追加リクエストは、すでに2つのアクティブ/オープンHttpWebRequestsが存在しますが、辛抱強くインラインで待機します。 HttpWebRequestオブジェクトの.ServicePoint.ConnectionLimitプロパティを設定することで、これを増やすことができます。

  • アセンブリをWITH PERMISSION_SET = EXTERNAL_ACCESSとしてマークする必要があります。怠惰にならず、TRUSTWORTHY ONを回してください。 不必要なセキュリティリスク です。これを安全にする適切な方法は、次のことです。

    • 議会に署名する
    • [master]データベースで、アセンブリのDLLから非対称キーを作成します。
    • また、[master]で、その非対称キーからログインを作成します
    • 新しいログインにEXTERNAL ACCESS Assembly権限を付与します
    • PERMISSION_SETEXTERNAL_ACCESSを使用してアセンブリを作成します。notUNSAFE

SQLCLRパスを下に行きたいが、コーディングなどを台無しにしたくない場合、1つのオプションは、事前に作成された関数を取得することです。 SQL# SQLCLRライブラリ(私が書いたもの)にはINET_GetWebPagesという関数があります(URLを呼び出し(GETまたはPOST data)に渡して)応答(および応答ヘッダーを個別のXMLフィールドとして返す)を呼び出す無料バージョンで利用可能)。

5
Solomon Rutzky