2017-12-20 16 views
1

Azure DataFactory V2からAzure SQL DBでストアドプロシージャを実行しようとしています。このプロシージャは、フラット・テーブルからのデータを使用して、異なるテーブルにアップサンプリングします。 MS spcificationsによると、このようなことをするためにテーブル値のパラメータが必要ですが、パイプラインアクティビティをプロシージャとすべてのモデルに結合します。ストアドプロシージャを実行するだけなので、データセットとコピーアクティビティを定義する方法はありますか?以下azure datafactoryからstoredProcedureを実行

jsonsは、アームテンプレートから、次のとおりです。

DataSet:  
{"type": "datasets", 
      "name": "AzureSQLProcedureDS", 
      "dependsOn": [ 
      "[parameters('dataFactoryName')]", 
      "[parameters('destinationLinkedServiceName')]" 
      ], 
      "apiVersion": "[variables('apiVersion')]", 
      "properties": { 
      "type": "AzureSqlTable", 
      "linkedServiceName": { 
       "referenceName": "[parameters('destinationLinkedServiceName')]", 
       "type": "LinkedServiceReference" 
      }, 
      "typeProperties": { 
       "tableName": "storeProcedureExecutions" 
      } 
      }} 




    Activity: 
    {"name": "ExecuteHarmonizationProcedure", 
        "description": "Executes the procedure that Harmonizes the Data", 
        "type": "Copy", 
        "inputs": [ 
         { 
         "referenceName": "[parameters('destinationDataSetName')]", 
         "type": "DatasetReference" 
         } 
        ], 
        "outputs": [ 
         { 
         "referenceName": "AzureSQLProcedureDS", 
         "type": "DatasetReference" 
         } 
        ], 
        "typeProperties": { 
         "source": { 
         "type": "SqlSink" 
         }, 
         "sink": { 
         "type": "SqlSink", 
         //"SqlWriterTableType": "storeProcedureExecutionsType", 
         "SqlWriterStoredProcedureName": "@Pipeline().parameters.procedureName", 
         "storedProcedureParameters": { 
          "param1": { 
          "value": "call from adf" 
          } 
         } 
         } 
        } 
} 

すべてのヘルプは、MSがこの主題のために多くの助けを提供しないことを考慮いただければ幸いです。

+0

問題が発生した場所と表示されるエラーメッセージは何ですか? –

+0

目的は、ダミーテーブルの作成を必要としないものを見つけることでした。この場合、これはSQLインジェクションをやや受けやすいためです。プロシージャの名前と必要なパラメータのみを指定する方法があれば、それが良いでしょう。 –

答えて

2

問題を正しく理解しているかどうかはわかりませんが、コピーアクティビティからストアドプロシージャを呼び出すだけですか?

コピー操作では、ソース内でsqlReaderQueryプロパティを定義できます。

"typeProperties": { 
     "source": { 
      "type": "SqlSource", 
      "sqlReaderQuery": "EXEC sp_Name; select 1 as test" 
     }, 
. . . 

コピー活動は常に、クエリからの結果を期待するので、あなただけのストアドプロシージャへの呼び出しが含まれている場合、それはthatsのをdoesntの:このプロパティは、あなたがこのような何かを行うことができますので、あなたは、T-SQLコマンドを入力することができますなぜ私はクエリの第2部分を含めるのですか?

使用するパラメータに置き換えて、それを置き換えます。

+0

私はそれを試して、それは動作しません。アクティビティは〜4分実行され、おそらくselect文の結果をソース/宛先にマップしようとするため失敗します。 –

+0

はい "select as as test"は1という値だけを持つtestという単一の列を返します。ダミーのデータセットを作成するか、ニーズに合わせてクエリを変更します。私が与えた例は、コピーアクティビティからストアドプロシージャを呼び出す方法を示しています。 –

+1

私はあなたが提案した通りに機能しましたが、それは直接的な解決策よりも回避策です。 DF v2の現在の状態と少なくとも別の方法がない場合、解決策として回答を受け入れるつもりです。 –

1

@Martinのアドバイスに続いて、私たちは実行作業をすることができました。以下は、私たちが何をしたか、次のとおりです。

  1. がSQLにダミーのテーブルを作成します。

    CREATE TABLE [dbo].[dummyTable]([col1] [nvarchar](100) NULL)

  2. はSQLでSPを作成します:SP用

    CREATE PROCEDURE [dbo].[sp_testHarmonize] @param1 NVARCHAR(200) AS BEGIN INSERT INTO storeProcedureExecutions VALUES (@param1,getdate()); END

  3. データセット:

    { "type": "datasets", "name": "[parameters('dummySQLTableDataSet')]", "dependsOn": ["[parameters('dataFactoryName')]", "[parameters('datalakeLinkedServiceName')]"], "apiVersion": "[variables('apiVersion')]", "properties": { "type": "AzureSqlTable", "linkedServiceName": { "referenceName": "[parameters('databaseLinkedServiceName')]", "type": "LinkedServiceReference" }, "typeProperties": { "tableName": "dummyTable" } } }

  4. パイプラインの活動:

    { "name": "ExecuteHarmonizationProcedure", "dependsOn": [{ "activity": "CopyCSV2SQL", "dependencyConditions": ["Succeeded"] }], "description": "Executes the procedure that Harmonizes the Data", "type": "Copy", "inputs": [{ "referenceName": "[parameters('dummySQLTableDataSet')]", "type": "DatasetReference" }], "outputs": [{ "referenceName": "[parameters('dummySQLTableDataSet')]", "type": "DatasetReference" }], "typeProperties": { "source": { "type": "SqlSource", "sqlReaderQuery": "@Pipeline().parameters.SQLCommand" }, "sink": { "type": "SqlSink" } } }

  5. 実行されるSQLコマンドの次のパラメータを持つパイプライン:

    $"EXEC sp_testHarmonize 'call from ADF at {DateTime.Now}'; select top 1 * from dummyTable;"

これは、それが働い作ったが、それは直接的な解決策よりもむしろ回避策として見えるダミーテーブルに行が挿入されていることが原因です。それ以上の直接的な解決策がない場合は、これが最も簡単なアプローチです。

関連する問題