在MS SQL上,如何创建一个只包含日期和星期几的表?

在MS SQL上,如何创建一个只包含日期和星期几的表?,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我需要在MS SQL 2014上创建一个表,显示日期和工作日列。它需要从2014-01-01开始,最后一天应该是今天。它应该看起来像下面的一个: days_date weekday 2014-01-01 Wednesday 2014-01-02 Thursday 2014-01-03 Friday ... ... 2018-03-06 Tuesday 我的相关脚本如下: CREATE TAB

我需要在MS SQL 2014上创建一个表,显示日期和工作日列。它需要从2014-01-01开始,最后一天应该是今天。它应该看起来像下面的一个:

   days_date      weekday
   2014-01-01     Wednesday
   2014-01-02     Thursday
   2014-01-03     Friday
   ...            ... 
   2018-03-06     Tuesday
我的相关脚本如下:

 CREATE TABLE [dbo].[new_table](
     [days_date] [date] NOT NULL,
     [weekday] [nvarchar](50) NULL
 ) ON [PRIMARY]

GO

 WITH CTE (DT) AS 
 (
    SELECT CAST('2014-01-01' AS DATE) DT
    UNION ALL
    SELECT DATEADD(DAY, 1, DT)
    FROM CTE
    WHERE DATEADD(DAY, 1, DT) < '2018-03-06'
 )
 INSERT INTO [dbo].[new_table]
          ([days_date]
          ,[weekday])
 VALUES
       (select * from CTE,
       ,select DATENAME(CTE,GETDATE()))
 GO

如何修复脚本?

插入查询中出现了一些语法错误。 此外,您尝试插入的datename与getdate相关,我猜这不是您的目标。您应该参考您的CTE日期别名:DT 试试这个:

CREATE TABLE [dbo].[new_table](
     [days_dates] [date] NOT NULL,
     [weekday] [nvarchar](50) NULL
 ) ON [PRIMARY]

GO

 WITH CTE (DT) AS 
 (
    SELECT CAST('2014-01-01' AS DATE) DT
    UNION ALL
    SELECT DATEADD(DAY, 1, DT)
    FROM CTE
    WHERE DATEADD(DAY, 1, DT) < '2018-03-06'
 )
 INSERT INTO [dbo].[new_table]
          ([days_dates]
          ,[weekday])
       (select * , DATENAME(WEEKDAY,dt) from CTE)
       OPTION (MaxRecursion 0)
 GO

不能在值内使用SELECT语句,而是使用SELECT替换值

按如下所示更改插入查询

;WITH CTE 
(
    DT
) AS 
(
    SELECT CAST('2014-01-01' AS DATE) DT
    UNION ALL
    SELECT 
       DATEADD(DAY, 1, DT)
       FROM CTE
          WHERE DATEADD(DAY, 1, DT) < '2018-03-06'
)
INSERT INTO [dbo].[new_table]
(
    [days_date],
    [weekday]
)
select
    DT,
    DATENAME(DW,DT)
    from CTE
OPTION(maxrecursion 0)

-将遇到以下错误消息:

Msg 530,16级,状态1,第1行 声明终止了。 在语句完成之前,已耗尽最大递归100。 为了克服此错误消息,可以指定MAXRECURSION查询提示,将最大递归次数从默认值100增加到最大值1000

 CREATE TABLE [dbo].[new_table](
         [days_date] [date] NOT NULL,
         [weekday] [nvarchar](50) NULL
     ) ON [PRIMARY]

; WITH CTE (DT) AS 
 (
    SELECT CAST('2014-01-01' AS DATE) DT
    UNION ALL
    SELECT DATEADD(DAY, 1, DT)
    FROM CTE 
    WHERE DATEADD(DAY, 1, DT) < =GETDATE()
 )

 INSERT INTO [dbo].[new_table]
          ([days_date]
          ,[weekday])
 SELECT DT,DATENAME(DW,DT)  
 FROM CTE OPTION (maxrecursion 0)

 GO
 SELECT * FROM new_table

-要解决此问题,请使用选项maxrecursion 0查看。这里有一个完整的例子,介绍了一个包含各种有用列的数字表。但是如果以后需要其他列呢?这里您缺少MAXRECURSION选项,没有它,您无法在该表中添加超过100个值。已经有另一个相同的答案。。请检查之前repost@B3s用户应该知道为什么在这里使用maxrecursion 0选项
 CREATE TABLE [dbo].[new_table](
         [days_date] [date] NOT NULL,
         [weekday] [nvarchar](50) NULL
     ) ON [PRIMARY]

; WITH CTE (DT) AS 
 (
    SELECT CAST('2014-01-01' AS DATE) DT
    UNION ALL
    SELECT DATEADD(DAY, 1, DT)
    FROM CTE 
    WHERE DATEADD(DAY, 1, DT) < =GETDATE()
 )

 INSERT INTO [dbo].[new_table]
          ([days_date]
          ,[weekday])
 SELECT DT,DATENAME(DW,DT)  
 FROM CTE OPTION (maxrecursion 0)

 GO
 SELECT * FROM new_table