【问题标题】:Azure Data Factory Delta Load - Issues with WatermarkAzure 数据工厂增量加载 - 水印问题
【发布时间】:2020-12-17 15:43:18
【问题描述】:

我正在尝试将上次更新日期发送到我的控制表。我按照 Msft 指南进行 incremental 加载,但在使用上次更新日期调用存储过程时出错。

我可以使用简单的插入语句将值插入水印列,但在使用存储过程时总是失败。我得到的错误信息是:

SQL Error [102] [S0001]: Incorrect syntax near '1/1/2010 12:00:00 AM'.

表定义:

CREATE TABLE Admin.dbo.Data_Load_Params (
    Identifier varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    Source_Table varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    Target_Table varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    Table_Type varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    Last_Update_Column varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    Schedule varchar(2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    Watermark datetime NULL
) GO;

我的存储过程:

CREATE PROCEDURE USP_WriteWatermarkValue (@WatermarkValue datetime, @TableName varchar(50))
AS

BEGIN

    UPDATE Data_Load_Params 
    SET [Watermark] = @WatermarkValue 
WHERE [Target_Table] = @TableName

END

然后我运行:

exec USP_Write_Watermark('2020-12-09T17:16:15Z', 'Journal_Headers')

但也使用了日期的变体,例如:

exec USP_Write_Watermark('1/1/2010 12:00:00 AM', 'Journal_Headers')

这个问题让我发疯了,因为我什至从 Msft 文档中复制了示例代码。

【问题讨论】:

  • 你在使用 Azure SQL 吗?
  • 嗨@Cobus van Rooyen,如果我的回答有误,请纠正我。

标签: azure-data-factory-2


【解决方案1】:

执行存储过程时是语法错误,不是日期格式的问题。为什么要加括号?我的意思是您需要将exec USP_Write_Watermark('2020-12-09T17:16:15Z', 'Journal_Headers') 更改为exec USP_Write_Watermark '2020-12-09T17:16:15Z', 'Journal_Headers'

我创建了一个测试来验证它。

CREATE TABLE [dbo].[person](
    [PersonID] [int] NULL,
    [Name] [varchar](20) NULL,
    [LastModifytime] [datetime] NULL
) ON [PRIMARY]
GO

 INSERT INTO [dbo].[person]
 (PersonID, Name, LastModifytime)
 VALUES
 (1, 'aaaa','9/1/2017 12:56:00 AM'),
 (2, 'bbbb','9/2/2017 5:23:00 AM'),
 (3, 'cccc','9/3/2017 2:36:00 AM'),
 (4, 'dddd','9/4/2017 3:21:00 AM'),
 (5, 'eeee','9/5/2017 8:06:00 AM');

 select * from [dbo].[person];


 CREATE TABLE [dbo].[watermarktable](
    [WatermarkValue] [datetime] NULL,
    [Target_Table] varchar(255)
) ON [PRIMARY]


INSERT INTO watermarktable
VALUES ('1/1/2010 12:00:00 AM','dbo.person')

select * from [dbo].[watermarktable]

create PROCEDURE [dbo].[update_watermark] @WatermarkValue datetime, @TableName varchar(255)
        AS
        BEGIN
            UPDATE dbo.watermarktable
            SET [WatermarkValue] = @WatermarkValue 
            WHERE [Target_Table] = @TableName

        END
GO


exec [dbo].[update_watermark] '2020-12-09T17:16:15Z', 'dbo.person'
exec [dbo].[update_watermark] '1/1/2010 12:00:00 AM', 'dbo.person'

效果很好。

【讨论】:

  • 谢谢约瑟夫。问题是括号。感谢您为测试解决方案所做的所有努力
猜你喜欢
  • 2020-07-06
  • 2023-01-31
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2020-12-27
相关资源
最近更新 更多