首页 > 解决方案 > Azure 数据工厂增量加载 - 水印问题

问题描述

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

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

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-data-factory-2

解决方案


执行存储过程时出现语法错误,而不是日期格式的问题。为什么要加括号?我的意思是您需要更改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'

它运作良好。
在此处输入图像描述


推荐阅读