Это заставило его работать, но это выглядит скорее как обходное решение, чем как прямое решение, учитывая, что он вставлен в пустую таблицу. Если нет более прямого решения, это самый простой подход.

аюсь выполнить хранимую процедуру в Azure SQL DB из Azure DataFactory V2. Процедура выполнит некоторую вставку в разные таблицы с данными из плоской таблицы. Согласно сMS spcification для этого нужно иметь параметр Table-value, который связывает активность конвейера с процедурой и со всеми моделями. Есть ли способ определить набор данных и операцию копирования, чтобы он просто выполнял хранимую процедуру?

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 не предоставляет такой помощи по этому вопросу.

 Estienne Granet23 дек. 2017 г., 00:49
Можете ли вы описать, где вы сталкиваетесь с трудностями и какое сообщение об ошибке вы получаете?
 g_brahimaj27 дек. 2017 г., 09:52
Цель состояла в том, чтобы найти что-то, что не делает необходимым создание фиктивной таблицы, потому что в этом случае это немного более склонно к внедрению sql. Если есть способ указать только название процедуры и необходимые параметры, было бы лучше.

Ответы на вопрос(2)

нам удалось заставить работу работать. Вот что мы сделали:

создать фиктивную таблицу в sql:

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

Создайте SP в SQL:

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

Набор данных для SP:

{ "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" } } }

Трубопроводная деятельность:

{ "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" } } }

Запустите конвейер со следующим параметром для команды sql:

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

Это заставило его работать, но это выглядит скорее как обходное решение, чем как прямое решение, учитывая, что он вставлен в пустую таблицу. Если нет более прямого решения, это самый простой подход.

Решение Вопроса

правильно ли я понимаю проблему, вы просто хотите вызвать хранимую процедуру из операции копирования?

Сделать это довольно легко, в операции копирования вы можете определить свойство sqlReaderQuery внутри источника. Это свойство позволяет вам вводить команду t-sql, поэтому вы можете сделать что-то вроде этого:

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

Операция копирования всегда ожидает результата от запроса, поэтому, если вы включаете только вызов хранимой процедуры, это не значит, что я включаю вторую часть запроса.

Замените на параметры, которые вы хотите использовать, и это все.

 g_brahimaj27 дек. 2017 г., 09:47
Я сделал, как вы предложили, и это сработало, но, как я разместил ниже, это скорее обходной путь, чем прямое решение. Если другого пути нет, по крайней мере с текущим состоянием DF v2, я приму ваш ответ как решение.
 Martin Esteban Zurita27 дек. 2017 г., 14:57
Просто протестируйте эти шаги, чтобы вызвать SP, который вызывает службу интеграции Azure (которую вы можете запустить с ADFv2), и это сработало !! Официальная документация гласит, что вам нужно вызвать его из ADF версии 1, используя хранимую процедуру. Это выглядит как лучший способ, учитывая, что вы используете только один экземпляр фабрики данных.
 g_brahimaj20 дек. 2017 г., 15:13
Я попробовал это, и это не работает. Действие выполняется в течение ~ 4 минут, а затем завершается неудачей, поскольку оно пытается отобразить результат, возможно, оператора select, в источник / место назначения.
 Martin Esteban Zurita20 дек. 2017 г., 15:45
Да, «выбрать 1 в качестве теста» вернет один столбец с именем test, и в качестве значения будет использоваться только 1. Создайте фиктивный набор данных или измените запрос в соответствии с вашими потребностями. Я привел вам пример, который показывает, как можно вызвать хранимую процедуру из операции копирования.

Ваш ответ на вопрос