繁体   English   中英

SQL无法为时间维度表插入数据

[英]SQL can't insert data for time dimension table

我正在为学校项目建立一个数据仓库。 我已经创建了时间维度表,并且可以使用。

`  CREATE TABLE TimeDim(
   [timeCode] int primary key,
   [date] datetime,
   [year] char(4),
   [month] varchar(2),
   [monthName] varchar(9),
   [Quarter] varchar(9),
   [dayOfMonth] varchar(2),
   [dayName] varchar(9),
   [dayOfQuarter] varchar(3),
   [dayOfYear] varchar(3),
   [weekOfMonth] varchar(1),
   [weekOfQuarter] varchar(2),
   [weekOfYear] varchar(2));`

但是,当我尝试在时间维度表中创建数据时会发生错误。错误显示:**

`Msg 213, Level 16, State 1, Line 95
Column name or number of supplied values does not match table definition.`

**我创建数据的代码是

 DECLARE @StartDate DATETIME = '01/01/2003' --Starting value of Date Range
DECLARE @EndDate DATETIME = '01/01/2006' --End Value of Date Range ( end at 31/12/1999)

--Temporary Variables To Hold the Values During Processing of Each Date of Year
DECLARE
    @DayOfWeekInMonth INT,
    @DayOfWeekInYear INT,
    @DayOfQuarter INT,
    @WeekOfMonth INT,
    @CurrentYear INT,
    @CurrentMonth INT,
    @CurrentQuarter INT

/*Table Data type to store the day of week count for the month and year*/
DECLARE @DayOfWeek TABLE (DOW INT, MonthCount INT, QuarterCount INT, YearCount INT)

INSERT INTO @DayOfWeek VALUES (1, 0, 0, 0)
INSERT INTO @DayOfWeek VALUES (2, 0, 0, 0)
INSERT INTO @DayOfWeek VALUES (3, 0, 0, 0)
INSERT INTO @DayOfWeek VALUES (4, 0, 0, 0)
INSERT INTO @DayOfWeek VALUES (5, 0, 0, 0)
INSERT INTO @DayOfWeek VALUES (6, 0, 0, 0)
INSERT INTO @DayOfWeek VALUES (7, 0, 0, 0)

--Extract and assign various parts of Values from Current Date to Variable

DECLARE @CurrentDate AS DATETIME = @StartDate
SET @CurrentMonth = DATEPART(MM, @CurrentDate)
SET @CurrentYear = DATEPART(YY, @CurrentDate)
SET @CurrentQuarter = DATEPART(QQ, @CurrentDate)

/********************************************************************************************/
--Proceed only if Start Date(Current date ) is less than End date you specified above

WHILE @CurrentDate < @EndDate
BEGIN

/*Begin day of week logic*/

         /*Check for Change in Month of the Current date if Month changed then 
          Change variable value*/
    IF @CurrentMonth != DATEPART(MM, @CurrentDate) 
    BEGIN
        UPDATE @DayOfWeek
        SET MonthCount = 0
        SET @CurrentMonth = DATEPART(MM, @CurrentDate)
    END

        /* Check for Change in Quarter of the Current date if Quarter changed then change 
         Variable value*/

    IF @CurrentQuarter != DATEPART(QQ, @CurrentDate)
    BEGIN
        UPDATE @DayOfWeek
        SET QuarterCount = 0
        SET @CurrentQuarter = DATEPART(QQ, @CurrentDate)
    END

        /* Check for Change in Year of the Current date if Year changed then change 
         Variable value*/


    IF @CurrentYear != DATEPART(YY, @CurrentDate)
    BEGIN
        UPDATE @DayOfWeek
        SET YearCount = 0
        SET @CurrentYear = DATEPART(YY, @CurrentDate)
    END

        -- Set values in table data type created above from variables 

    UPDATE @DayOfWeek
    SET 
        MonthCount = MonthCount + 1,
        QuarterCount = QuarterCount + 1,
        YearCount = YearCount + 1
    WHERE DOW = DATEPART(DW, @CurrentDate)

    SELECT
        @DayOfWeekInMonth = MonthCount,
        @DayOfQuarter = QuarterCount,
        @DayOfWeekInYear = YearCount
    FROM @DayOfWeek
    WHERE DOW = DATEPART(DW, @CurrentDate)

/*End day of week logic*/


/* Populate Your Dimension Table with values*/

    INSERT INTO [dbo].[TimeDim]
    SELECT

        CONVERT (char(8),@CurrentDate,112) as timeCode,
        @CurrentDate AS date,
        CONVERT (char(10),@CurrentDate,103) as FullDateUK,
        CONVERT (char(10),@CurrentDate,101) as FullDateUSA,
        DATEPART(DD, @CurrentDate) AS dayOfMonth,
        --Apply Suffix values like 1st, 2nd 3rd etc..   
        DATENAME(DW, @CurrentDate) AS dayName,  
        @DayOfQuarter AS dayOfQuarter,
        DATEPART(DY, @CurrentDate) AS dayOfYear,
        DATEPART(WW, @CurrentDate) + 1 - DATEPART(WW, CONVERT(VARCHAR, 
        DATEPART(MM, @CurrentDate)) + '/1/' + CONVERT(VARCHAR, 
        DATEPART(YY, @CurrentDate))) AS weekOfMonth,
        (DATEDIFF(DD, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), 
        @CurrentDate) / 7) + 1 AS weekOfQuarter,
        DATEPART(WW, @CurrentDate) AS weekOfYear,
        DATEPART(MM, @CurrentDate) AS month,
        DATENAME(MM, @CurrentDate) AS monthName,

        DATEPART(QQ, @CurrentDate) AS Quarter,

        DATEPART(YEAR, @CurrentDate) AS year


    SET @CurrentDate = DATEADD(DD, 1, @CurrentDate)
END

错误非常明显:

列名或提供的值数与表定义不匹配。

这意味着您尝试插入的值数与列数不匹配。

列数13 ,其次是:

  1. 时间码
  2. 日期
  3. monthName
  4. 25美分硬币
  5. dayOfMonth
  6. dayName
  7. dayOfQuarter
  8. dayOfYear
  9. weekOfMonth
  10. weekOfQuarter
  11. YearOfYear

值的数目36 ,如下所示:

  1. 时间键
  2. 日期
  3. FullDateUK
  4. 全日美国
  5. DayOfMonth
  6. DaySuffix
  7. 日名
  8. 美国周刊
  9. DayOfWeekUK
  10. DayOfWeekInMonth
  11. DayOfWeekInYear
  12. DayOfQuarter
  13. 一年中的一天
  14. 月度周
  15. 四分之一周
  16. 年度周
  17. 月名
  18. 四分之一月
  19. 25美分硬币
  20. 季度名称
  21. 年份名称
  22. 年月
  23. MMYYYY
  24. FirstDayOfMonth
  25. LastDayOfMonth
  26. 第一季
  27. LastDayOfQuarter
  28. 年的第一天
  29. 年的LastDay
  30. 美国假期
  31. 平日
  32. 假日美国
  33. (无列名)
  34. (无列名)

更新:-

编辑脚本后,错误仍然存​​在,因为值的数目为15 ,如下所示:

  1. 时间码
  2. 日期
  3. FullDateUK
  4. 全日美国
  5. dayOfMonth
  6. dayName
  7. dayOfQuarter
  8. dayOfYear
  9. weekOfMonth
  10. weekOfQuarter
  11. YearOfYear
  12. monthName
  13. 25美分硬币

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM