Sql server SQL Server:在插入时使用case

Sql server SQL Server:在插入时使用case,sql-server,switch-statement,Sql Server,Switch Statement,我有以下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 (da

我有以下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)
当我尝试执行请求时,我看到以下内容:

味精156,15级,状态1,第14行 关键字“CASE”附近的语法不正确


我做错了什么?

看起来您得到了要插入的字段列表和要插入的值的选择列表。应该是这样的:

;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子句和大小写出现在同一个查询中,但引用的代码至少应能解决语法错误。

CASE when DATEPARTdw,workingDays+@@DATEFIRST%7不在0中,1则1 ELSE 0 END应该可以。@Loser不应该,逗号不应该在那里
   ;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)
   ;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)