Не удается найти ошибку в хранимой процедуре T- SQL | Скрипт заполнения даты - PullRequest
0 голосов
/ 11 апреля 2020

Это моя процедура:

ALTER PROCEDURE [dbo].[sp_ETL Populate Dim Date]
    @start_date NVARCHAR(10) = N'2009-01-01',
    @end_date NVARCHAR(10) = N'2010-12-31'
AS

TRUNCATE TABLE [STG Dim Date]

Declare
 @Date date,
 @endDate date,
 @IsLeapYear BIT,
 @IsWeekend BIT

Set @Date = @start_date
Set @endDate = @end_date

-- Loop through dates until end date
WHILE @Date <=@endDate
BEGIN
LINENO 0
-- Check for leap year
    IF ((Year(@Date) % 4 = 0) AND (Year(@Date) % 100 != 0 OR Year(@Date) % 400 = 0))
    BEGIN
        SELECT @IsLeapYear = 1
    END
    ELSE
    BEGIN
        SELECT @IsLeapYear = 0
    END
-- Check for weekend
    IF (DATEPART(dw, @Date) = 6 OR DATEPART(dw, @Date) = 7)
    BEGIN
        SELECT @IsWeekend = 1
    END
    ELSE
    BEGIN
        SELECT @IsWeekend = 0
    END
-- Insert data in dim date table
    INSERT Into [Baraam Retail STG].[dbo].[STG Dim Date]
    (
      [DateKey],         
      [Date],
      [DateString],
      [DayofMonth],
      [DayofYear],
      [DayofWeek],
      [DayofWeeknameENG],
      [DayofWeeknameHEB],
      [Week],
      [Month],
      [MonthNameENG],
      [MonthNameHEB],
      [MonthYear],
      [Qrt],
      [Qrt Name],
      [Year],
      [IsWeekend],
      [IsLeapYear]
    )
    Values
    (
    YEAR(@Date)*10000+MONTH(@Date)*100+DAY(@Date), -- DateKey | yyyymmdd
    @Date, -- Date |  yyyy-mm-dd 
    CONVERT(nvarchar(10), @Date, 105), -- DateString | dd-mm-yyyy
    Day(@Date), -- Day of Month | 1-31
    DATEPART(dy, @Date), -- Day of Year
    DATEPART(dw, @Date), -- Day of Week
    DATENAME(dw, @Date), -- English Day of Week Name
    CASE DATEPART(dw, @Date) -- Hebrew Day of Week Name
        WHEN 1 THEN N'ראשון'
        WHEN 2 THEN N'שני'
        WHEN 3 THEN N'שלישי'
        WHEN 4 THEN N'רביע'
        WHEN 5 THEN N'חמישי'
        WHEN 6 THEN N'שישי'
        WHEN 7 THEN N'שבת'
    END,
    DATEPART(wk, @Date), -- Week of Year
    DATEPART(mm, @Date), -- Month of Year | 1-12
    DATENAME(mm, @Date), -- English Month of Year Name 
    CASE DATEPART(mm, @Date) -- Hebrew Month of Year Name 
        WHEN 1 THEN N'ינואר'
        WHEN 2 THEN N'פברואר'
        WHEN 3 THEN N'מרצ'
        WHEN 4 THEN N'אפריל'
        WHEN 5 THEN N'מאי'
        WHEN 6 THEN N'יוני'
        WHEN 7 THEN N'יולי'
        WHEN 8 THEN N'אוגוסט'
        WHEN 9 THEN N'ספטמבר'
        WHEN 10 THEN N'אוקטובר'
        WHEN 11 THEN N'נובמבר'
        WHEN 12 THEN N'דצמבר'
    END,
    CONCAT(RIGHT(('0'+CAST(MONTH(@Date)AS VARCHAR(2))),2),'-',YEAR(@Date)), -- Month Year | mm-yyyy
    DATENAME(qq, @Date), -- Qrt
    CASE DATEPART(qq, @Date) -- Qrt Name
        WHEN 1 THEN N'Q-1'
        WHEN 2 THEN N'Q-2'
        WHEN 3 THEN N'Q-3'
        WHEN 4 THEN N'Q-4'
    END,
    Year(@Date),
    @IsWeekend,
    @IsLeapYear 
    )
    -- Step to next day
    SET @Date = DATEADD(dd, 1, @Date)
END
-- Join Holidays
UPDATE [Baraam Retail STG].[dbo].[STG Dim Date]
SET 
    [HolidayName] = ISNULL([Baraam Retail STG].[dbo].[STG Hashing Holidays].[Period], N'יום חול'),
    [IsHoliday] = 
     CASE WHEN [Baraam Retail STG].[dbo].[STG Hashing Holidays].[Period] IS NULL
        THEN 0
        ELSE 1
     END
FROM [STG Dim Date] LEFT JOIN [Baraam Retail STG].[dbo].[STG Hashing Holidays]
ON [STG Dim Date].[Date] BETWEEN [STG Hashing Holidays].[Begining] AND [STG Hashing Holidays].[End]

По сути, профи c получает начальную дату и конечную дату. Он заполняет таблицу дат Dim.

Я выполняю его с помощью этого сценария:

EXEC [sp_ETL Populate Dim Date]
@start_date = '2009-01-01',
@end_date = '2010-12-31'

Я получаю сообщение об ошибке:

Msg 241, уровень 16 , Состояние 1, Процедура sp_ETL Заполнить затемненную дату, строка 20 [Пакетная строка начала 0] Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Я использовал этот сценарий для создания таблицы затемнения даты :

CREATE TABLE [Baraam Retail STG].[dbo].[STG Dim Date]
(
  [DateKey]             INT,         
  [Date]                DATE,
  [DateString]          DATE,
  [DayofMonth]          BIT,
  [DayofYear]           SMALLINT,
  [DayofWeek]           TINYINT,
  [DayofWeeknameENG]    VARCHAR(10),
  [DayofWeeknameHEB]    VARCHAR(10),
  [Week]                TINYINT,
  [Month]               TINYINT,
  [MonthNameENG]        VARCHAR(10),
  [MonthNameHEB]        VARCHAR(10),
  [MonthYear]           CHAR(7),
  [Qrt]                 TINYINT,
  [Qrt Name]            CHAR(7),
  [Year]                SMALLINT,
  [IsWeekend]           BIT,
  [IsLeapYear]          BIT,
  [IsHoliday]           BIT,
  [HolidayName]         VARCHAR(50)
)

Проверяя вывод в таблице Dim Date, pro c инициирует и зацикливает 12 дат (с 2019-01-01 по 2019-01-12). Все выходные данные верны. Останавливается на 2019-01-13. Я создал команду печати для каждого вычисления, и она, кажется, работает хорошо.

Моя версия SSMS не имеет отладчика. Поэтому я не могу использовать его для устранения проблемы.

Что вы думаете?

1 Ответ

0 голосов
/ 11 апреля 2020

Проблема, безусловно, заключается в присвоении выражения

CONVERT(nvarchar(10), @Date, 105)

полю DATESTR. Не ясно, что вы пытаетесь выполнить здесь sh, но сервер SQL не обязательно сможет проанализировать эту строку как дату.

...