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