将日期时间参数从管道传递到数据流源存储过程 Azure 数据工厂

Posted

技术标签:

【中文标题】将日期时间参数从管道传递到数据流源存储过程 Azure 数据工厂【英文标题】:Pass datetime parameter from pipeline to dataflow source stored procedure azure data factory 【发布时间】:2021-06-22 14:30:18 【问题描述】:

当我尝试将 datetime 参数从管道传递到数据流存储过程时,我遇到了这个问题。 我使用存储过程来获取完整或增量数据集。 管道看起来像这样 pipeline 在查找中,我得到“n/a”或最后加载日期。确定我需要完全加载还是增量加载。 之后,我使用以下表达式将其传递给数据流:

加载开始日期activity('GetLastLoadData').output.value[0].LastLoadedDate 加载结束日期if(equals(activity('GetLastLoadData').output.value[0].LastLoadedDate, 'n/a'), '' ,pipeline().TriggerTime)

parameters

输出看起来不错,据我所知,数据流的参数是用日期时间字符串设置的:

Input

    "dataflow": 
        "referenceName": "dataflow1",
        "type": "DataFlowReference",
        "parameters": 
            "LoadStartDate": "'2021-01-16 14:15:36.697'",
            "LoadEndDate": "'2021-03-25T18:08:48.7558444Z'"
        ,

存储过程有两个定义为字符串的参数。我正在做验证

 CREATE PROCEDURE [dbo].[Export]
@LoadStartDate VARCHAR(30) = NULL,
@LoadEndDate VARCHAR(30) = NULL

AS 

DECLARE @error VARCHAR(200) = NULL

IF (@LoadStartDate IS NULL AND @LoadEndDate IS NOT NULL) OR
   (@LoadStartDate IS NOT NULL AND @LoadEndDate IS NULL)
   SELECT @error = 'Parameters @LoadStartDate and @LoadEndDate should be specified.'

IF @LoadStartDate IS NOT NULL AND TRY_CAST(@LoadStartDate AS DATETIME2(3)) IS NULL 
SELECT @error = 'Parameter @LoadStartDate is not a date.'
IF @LoadEndDate IS NOT NULL AND TRY_CAST(@LoadEndDate AS DATETIME2(3)) IS NULL 
SELECT @error = ' Parameter @LoadEndDate is not a date.'

在管理工作室程序运行良好,但在 adf...

ADF 数据流有两个参数定义为字符串 ADF parameters

源的设置如下所示: source settings

当我删除输入参数时,一切正常(作为满载),但是当我尝试指定参数时它失败了。

Error details
Error code
DFExecutorUserError
Troubleshooting guide
Failure type
User configuration issue
Details
"StatusCode":"DFExecutorUserError","Message":"Job failed due to reason: Incorrect syntax near '-'.","Details":"Incorrect syntax near '-'."
Source
Pipeline
LoadDataSetCompany_copy1
Data flow
dataflow1
Monitor
Data flow activity
LoadDataSet

在将参数传递给数据流期间,我也尝试选择表达式复选框,但没有帮助。

有人知道出了什么问题吗?

感谢答案。

【问题讨论】:

可以查看源数据预览吗? 是的,但前提是我没有为存储过程指定输入参数 嗨@edKud,您是否使用其他活动数据流?您可以尝试查找 + 复制活动来构建您的管道吗? @LeonYue 谢谢,看来这只是工作案例 是的,不客气。我可以将其发布为答案吗? 【参考方案1】:

我与微软支持人员进行了讨论,在他们的帮助下我终于解决了这个问题。

在数据流中传递参数的表达式应该类似于“'$LoadStartDate'”。以这种方式传递参数后,解析错误消失了。

此外,在我的存储过程中,如果参数包含不适当的值,我会在参数验证后使用 t-sql throw。应该避免抛出,当我删除它时,数据流开始按预期工作。

希望这些信息能为某人节省时间。

【讨论】:

【参考方案2】:

根据我的经验,您可能不需要使用数据流来构建您的管道。存储过程是 Data Flow 的新功能,可能仍然存在一些问题。

请尝试 Lookup active + Copy active 来构建管道,它应该可以正常工作。

HTH。

【讨论】:

不幸的是,我必须这样做。因为我需要对数据集进行大量的转换和验证。但根据您的建议,我可以暂存数据并使用暂存数据集作为源

以上是关于将日期时间参数从管道传递到数据流源存储过程 Azure 数据工厂的主要内容,如果未能解决你的问题,请参考以下文章

将参数从 ReportViewer 传递到 s-s-rS 报告的存储过程数据源

从FORM传递参数到存储过程

我们可以使用 Azure 存储队列作为事件源吗?

如何将最佳参数(使用 GridSearchCV)从管道传递到另一个管道

如何将输出参数从 vb.net 传递到 mysql 存储过程?

如何将结果集作为输入从java传递到oracle存储过程