Как передать результат предыдущего шага следующему в Azure Data Factory V2? - PullRequest
0 голосов
/ 16 мая 2019

Я построил последовательность действий в фабрике данных, как показано на рисунке ниже.

enter image description here

Мне интересно, как я могу захватить и передать выходные данные SQL Server (включая сообщения об ошибках) из Step 1 в Step 2. Как показано на скриншоте, в настоящее время я использую @activity('PR_TEST_RAISE_ERROR').output в надежде, что он фиксирует сообщение об ошибке наподобие ERROR: test error message, но когда я проверил таблицу журнала, сообщение, которое мы получили от использования @activity('PR_TEST_RAISE_ERROR').output, выглядит так:

enter image description here

Если кто-то захочет повторить то, с чем я сталкиваюсь, код для хранимой процедуры в Step 1 выглядит следующим образом:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[PR_TEST_RAISE_ERROR]
AS
RAISERROR ('ERROR: test error message',16,1);

GO

Для Step 2, когда Шаг 1 выполнен успешно, я запускаю хранимую процедуру с параметрами, подобными этим:

exec [dbo].[PR_TEST_LOG_ERROR_CATCHING] '[pr_test_sql_error_catching]', 'success'

Для Step 2, когда шаг 1 не выполнен, я выполняю ту же хранимую процедуру, как указано ниже:

exec [dbo].[PR_TEST_LOG_ERROR_CATCHING] '[pr_test_sql_error_catching]', 'failure'

где [dbo].[PR_TEST_LOG_ERROR_CATCHING] кодируется так:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[PR_TEST_LOG_ERROR_CATCHING]
                            (
                                @log_table_name AS NVARCHAR(100),
                                @message AS NVARCHAR(MAX)
                            )
AS
DECLARE @cur_date DATETIME = getdate();
DECLARE @query NVARCHAR(MAX);
    SET @query = (
            'INSERT INTO [dbo].' + @log_table_name 
            + '(
                [Message],
                [Logged_On]
            )
            VALUES ('''
            + @message + ''','
            + '''' + CONVERT(NVARCHAR, @cur_date) + ''''
            + ');'
        );

    EXEC (@query)
GO

и таблица журнала (@log_table_name) [pr_test_sql_error_catching] создается следующим образом:

CREATE TABLE Persons (
    Message nvarchar(max),
    Logged_On datetime
);

Если кому-то интересно узнать исходный код всей последовательности действий фабрики данных, это будет выглядеть так:

{
    "name": "pr_test_sql_error_catching",
    "properties": {
        "description": "Example pipeline showing how we can catch SQL errors",
        "activities": [
            {
                "name": "PR_TEST_RAISE_ERROR",
                "description": "[dbo].[PR_TEST_RAISE_ERROR]",
                "type": "SqlServerStoredProcedure",
                "policy": {
                    "timeout": "7.00:00:00",
                    "retry": 0,
                    "retryIntervalInSeconds": 30,
                    "secureOutput": false,
                    "secureInput": false
                },
                "typeProperties": {
                    "storedProcedureName": "[dbo].[PR_TEST_RAISE_ERROR]"
                },
                "linkedServiceName": {
                    "referenceName": "pr_us_programmatic_sql_db",
                    "type": "LinkedServiceReference"
                }
            },
            {
                "name": "PR_TEST_LOG_ERROR_CATCHING_When_successful",
                "description": "[dbo].[PR_TEST_LOG_ERROR_CATCHING]",
                "type": "SqlServerStoredProcedure",
                "dependsOn": [
                    {
                        "activity": "PR_TEST_RAISE_ERROR",
                        "dependencyConditions": [
                            "Succeeded"
                        ]
                    }
                ],
                "policy": {
                    "timeout": "7.00:00:00",
                    "retry": 0,
                    "retryIntervalInSeconds": 30,
                    "secureOutput": false,
                    "secureInput": false
                },
                "typeProperties": {
                    "storedProcedureName": "[dbo].[PR_TEST_LOG_ERROR_CATCHING]",
                    "storedProcedureParameters": {
                        "log_table_name": {
                            "value": "[pr_test_sql_error_catching]",
                            "type": "String"
                        },
                        "message": {
                            "value": "success",
                            "type": "String"
                        }
                    }
                },
                "linkedServiceName": {
                    "referenceName": "pr_sql_db",
                    "type": "LinkedServiceReference"
                }
            },
            {
                "name": "PR_TEST_LOG_ERROR_CATCHING_When_Errored",
                "type": "SqlServerStoredProcedure",
                "dependsOn": [
                    {
                        "activity": "PR_TEST_RAISE_ERROR",
                        "dependencyConditions": [
                            "Failed"
                        ]
                    }
                ],
                "policy": {
                    "timeout": "7.00:00:00",
                    "retry": 0,
                    "retryIntervalInSeconds": 30,
                    "secureOutput": false,
                    "secureInput": false
                },
                "typeProperties": {
                    "storedProcedureName": "[dbo].[PR_TEST_LOG_ERROR_CATCHING]",
                    "storedProcedureParameters": {
                        "log_table_name": {
                            "value": "[pr_test_sql_error_catching]",
                            "type": "String"
                        },
                        "message": {
                            "value": {
                                "value": "@activity('PR_TEST_RAISE_ERROR').output",
                                "type": "Expression"
                            },
                            "type": "String"
                        }
                    }
                },
                "linkedServiceName": {
                    "referenceName": "pr_sql_db",
                    "type": "LinkedServiceReference"
                }
            }
        ]
    },
    "type": "Microsoft.DataFactory/factories/pipelines"
}

Заранее благодарим вас за ваши ответы / предложения относительно того, как я могу передать сообщение об ошибке (или любой другой вывод) с предыдущего шага на следующий в фабрике данных Azure!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...