简体   繁体   English

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

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

I am building a Data warehouse for my school project. 我正在为学校项目建立一个数据仓库。 I have already created my time dimension table and it works. 我已经创建了时间维度表,并且可以使用。

`  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));`

However, the errors occur when I try to create data in the Time Dimension table.The error shows: ** 但是,当我尝试在时间维度表中创建数据时会发生错误。错误显示:**

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

** The code for me to create data is **我创建数据的代码是

 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

The Error is so clear:- 错误非常明显:

Column name or number of supplied values does not match table definition. 列名或提供的值数与表定义不匹配。

That means you trying insert number of values doesn't match with number of columns. 这意味着您尝试插入的值数与列数不匹配。

The number of Columns is 13 , as next:- 列数13 ,其次是:

  1. timeCode 时间码
  2. date 日期
  3. year
  4. month
  5. monthName monthName
  6. Quarter 25美分硬币
  7. dayOfMonth dayOfMonth
  8. dayName dayName
  9. dayOfQuarter dayOfQuarter
  10. dayOfYear dayOfYear
  11. weekOfMonth weekOfMonth
  12. weekOfQuarter weekOfQuarter
  13. weekOfYear YearOfYear

The number of values is 36 , as following:- 值的数目36 ,如下所示:

  1. TimeKey 时间键
  2. Date 日期
  3. FullDateUK FullDateUK
  4. FullDateUSA 全日美国
  5. DayOfMonth DayOfMonth
  6. DaySuffix DaySuffix
  7. DayName 日名
  8. DayOfWeekUSA 美国周刊
  9. DayOfWeekUK DayOfWeekUK
  10. DayOfWeekInMonth DayOfWeekInMonth
  11. DayOfWeekInYear DayOfWeekInYear
  12. DayOfQuarter DayOfQuarter
  13. DayOfYear 一年中的一天
  14. WeekOfMonth 月度周
  15. WeekOfQuarter 四分之一周
  16. WeekOfYear 年度周
  17. Month
  18. MonthName 月名
  19. MonthOfQuarter 四分之一月
  20. Quarter 25美分硬币
  21. QuarterName 季度名称
  22. Year
  23. YearName 年份名称
  24. MonthYear 年月
  25. MMYYYY MMYYYY
  26. FirstDayOfMonth FirstDayOfMonth
  27. LastDayOfMonth LastDayOfMonth
  28. FirstDayOfQuarter 第一季
  29. LastDayOfQuarter LastDayOfQuarter
  30. FirstDayOfYear 年的第一天
  31. LastDayOfYear 年的LastDay
  32. IsHolidayUSA 美国假期
  33. IsWeekday 平日
  34. HolidayUSA 假日美国
  35. (No column name) (无列名)
  36. (No column name) (无列名)

UPDATE:- 更新:-

After Editing the script , the error still existing, because the number of values is 15 as following:- 编辑脚本后,错误仍然存​​在,因为值的数目为15 ,如下所示:

  1. timeCode 时间码
  2. date 日期
  3. FullDateUK FullDateUK
  4. FullDateUSA 全日美国
  5. dayOfMonth dayOfMonth
  6. dayName dayName
  7. dayOfQuarter dayOfQuarter
  8. dayOfYear dayOfYear
  9. weekOfMonth weekOfMonth
  10. weekOfQuarter weekOfQuarter
  11. weekOfYear YearOfYear
  12. month
  13. monthName monthName
  14. Quarter 25美分硬币
  15. year

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

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