Дельта-загрузка фабрики данных Azure — проблемы с водяным знаком

#azure-data-factory-2

#azure-data-factory-2

Вопрос:

Я пытаюсь отправить дату последнего обновления в свою контрольную таблицу. Я следую инструкциям Msft для выполнения дополнительных загрузок, но получаю сообщение об ошибке при вызове сохраненного процесса с датой последнего обновления.

Я могу вставлять значения в столбец водяных знаков с помощью простого оператора insert, но при использовании сохраненной процедуры всегда происходит сбой. Я получаю сообщение об ошибке:

 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.

Комментарии:

1. Используете ли вы Azure SQL?

2. Привет @Cobus van Rooyen, пожалуйста, поправьте меня, если я неправильно понял вас в ответе.

Ответ №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'

 

Это работает хорошо.
введите описание изображения здесь

Комментарии:

1. Спасибо, Джозеф. Проблема заключалась в скобках. Спасибо за все ваши усилия по тестированию вашего решения