Это моя процедура:
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 не имеет отладчика. Поэтому я не могу использовать его для устранения проблемы.
Что вы думаете?