首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在the存储过程\ Dim日期填充脚本上找到错误

无法在the存储过程\ Dim日期填充脚本上找到错误
EN

Stack Overflow用户
提问于 2020-04-11 16:31:45
回答 1查看 71关注 0票数 0

这是我的程序:

代码语言:javascript
复制
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]

基本上,proc会得到一个开始日期和结束日期。它填充一个Dim日期表。

我正在通过这个脚本执行它:

代码语言:javascript
复制
EXEC [sp_ETL Populate Dim Date]
@start_date = '2009-01-01',
@end_date = '2010-12-31'

我收到一条错误消息:

Msg 241,级别16,状态1,过程sp_ETL填充Dim日期,第20行批处理开始行0转换失败时,转换日期和/或时间从字符串。

我使用这个脚本来创建Dim日期表:

代码语言:javascript
复制
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日期表中的输出,proc启动并循环12个日期(2019-01-01至2019-01- 12 )。所有输出都是正确的。它停在2019年-01-13号。我为每个计算创建了一个print命令,它似乎运行得很好。

我的SSMS版本没有调试器。所以我不能用它来调试问题。

你认为如何?

EN

回答 1

Stack Overflow用户

发布于 2020-04-11 17:08:50

问题是分配表达式

代码语言:javascript
复制
CONVERT(nvarchar(10), @Date, 105)

到DATESTR字段。这里还不清楚您想要完成什么,但是SQL server不一定能够将此字符串解析为日期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61160130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档