我需要在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
在这里得到一些错误:
Msg 156, Level 15, State 1, Line 13
Incorrect syntax near the keyword 'select'.
Msg 156, Level 15, State 1, Line 14
Incorrect syntax near the keyword 'SELECT'.
Msg 155, Level 15, State 1, Line 14
'CTE' is not a recognized datename option.
我该如何修复脚本?
您在插入查询中遇到了一些语法错误。更多,你试图插入的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,Level 16,State 1,Line 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
- 来过来这样的问题使用OPTION(maxrecursion 0)