Azure 数据工厂增量负载 - 水印问题
Azure Data Factory Delta Load - Issues with Watermark
我正在尝试将上次更新日期发送到我的控件 table。我按照 Msft 指南执行 incremental 加载,但在使用最后更新日期调用存储过程时出现错误。
我可以使用简单的插入语句将值插入水印列,但在使用存储过程时总是失败。我收到的错误消息是:
SQL Error [102] [S0001]: Incorrect syntax near '1/1/2010 12:00:00 AM'.
Table定义:
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 文档中复制了示例代码。
执行存储过程时的语法错误不是日期格式的问题。为什么要加括号?我的意思是您需要将 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'
效果很好。
我正在尝试将上次更新日期发送到我的控件 table。我按照 Msft 指南执行 incremental 加载,但在使用最后更新日期调用存储过程时出现错误。
我可以使用简单的插入语句将值插入水印列,但在使用存储过程时总是失败。我收到的错误消息是:
SQL Error [102] [S0001]: Incorrect syntax near '1/1/2010 12:00:00 AM'.
Table定义:
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 文档中复制了示例代码。
执行存储过程时的语法错误不是日期格式的问题。为什么要加括号?我的意思是您需要将 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'
效果很好。