2016-03-02 122 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子句,並在同一查詢的情況下,但所引用的代碼應該至少解決語法錯誤。