2016-03-02 123 views
1

使用情况我有以下SQL:SQL服务器:在插入

;WITH DatesCTE AS 
(
    SELECT CAST('2016-01-01' AS DATE) AS [workingDays] 

    UNION ALL 

    SELECT DATEADD(DAY, 1, workingdays) 
    FROM DatesCTE 
    WHERE DATEADD(DAY, 1, workingdays) < '2017-01-01' 
) 
insert into dbo.tWorkingDays 
    (date, 
    CASE ((DATEPART(dw, workingDays) + @@DATEFIRST) % 7) NOT IN (0, 1) when TRUE THEN 1, 
     ELSE 0 
    END 
    ) 
SELECT * 
FROM DatesCTE 
WHERE ((DATEPART(dw, workingDays) + @@DATEFIRST) % 7) NOT IN (0, 1) 
OPTION (MAXRECURSION 366) 

和下表:

CREATE TABLE [dbo].[tWorkingDays] 
(
    [date] [date] NOT NULL, 
    [is_business_day][bit] NOT NULL DEFAULT 1, 

    CONSTRAINT [PK_tWorkingDays] 
     PRIMARY KEY CLUSTERED ([date] ASC) 
) ON [PRIMARY] 

当我尝试执行请求我看到以下内容:

Msg 156,Level 15,State 1,Line 14
关键字'CASE'附近的语法不正确。

我做错了什么?

+0

'情况下,当((DATEPART(DW,workingDays)+ @@ DATEFIRST)%7)NOT IN(0,1)THEN 1 ELSE 0 END'它应该是没关系。 – Kason

+0

@迟些不应该,逗号不应该在那里 – Yossi

回答

1
;WITH DatesCTE AS (
     SELECT CAST('20160101' AS DATE) AS [workingDays] 
     UNION ALL 

     SELECT DATEADD(DAY, 1, workingdays) 
     FROM DatesCTE 
     WHERE DATEADD(DAY, 1, workingdays) < '2017-01-01' 
    ) 
    INSERT INTO dbo.tWorkingDays (date, is_business_day) 
    SELECT *, CASE WHEN (DATEPART(dw, workingDays) + @@DATEFIRST) % 7 NOT IN (0, 1) THEN 1 ELSE 0 END 
    FROM DatesCTE 
    --WHERE (DATEPART(dw, workingDays) + @@DATEFIRST) % 7 NOT IN (0, 1) 
    OPTION (MAXRECURSION 366) 
1

看起来像是已经将选定列表(要插入的值)与字段列表(要插入的字段)混合在一起。它应该是这样的:

;WITH DatesCTE 
AS (

    SELECT CAST('2016-01-01' AS DATE) AS [workingDays] 
    UNION ALL 

    SELECT DATEADD(DAY, 1, workingdays) 
    FROM DatesCTE 
    WHERE DATEADD(DAY, 1, workingdays) < '2017-01-01' 

) 
insert into dbo.tWorkingDays 
    (date, is_business_day) 
SELECT workingDays, 
    CASE WHEN ((DATEPART(dw, workingDays) + @@DATEFIRST) % 7) NOT IN (0, 1) THEN 1 ELSE 0 
    END 
FROM DatesCTE 
WHERE ((DATEPART(dw, workingDays) + @@DATEFIRST) % 7) NOT IN (0, 1) 
OPTION (MAXRECURSION 366) 

你可能不希望在WHERE子句,并在同一查询的情况下,但所引用的代码应该至少解决语法错误。