视图逻辑中的 SQL case 语句

问题描述

CREATE VIEW [Myview] AS
SELECT 
  CASE
    WHEN 
    DATENAME(dw,DATEADD(yy,DATEDIFF(yy,GETDATE()),0))='Sunday'
    THEN
        SELECT 
            cast(DATEPART(yyyy,getdate()-7) as varchar(4)) as YEAR,RIGHT('00'+cast(DATEPART(ww,getdate()-7) as varchar(2)),2) as WEEK;    
    ELSE
        SELECT 
            cast(DATEPART(yyyy,getdate()-14) as varchar(4)) as YEAR,getdate()-14) as varchar(2)),2) as WEEK;
GO

创建时出错:消息 103010,级别 16,状态 1,第 1 行解析 第 8 行错误,第 3 列:“SELECT”附近的语法不正确。

帮我解决这个错误。 我想检查一年的第一天是否是星期日,然后我会遵循 then 声明。然后语句建议获取周 ID 和年份。enter image description here

解决方法

您的 SQL 存在多个问题。首先,您的查询中有 3 个 use winsafe::{self as w,co,shell}; let hwnd: HWND; // handle to your window,initialized somewhere // Create the COM object. let itbl: shell::ITaskbarList4 = w::CoCreateInstance( &shell::clsid::TaskbarList,None,co::CLSCTX::INPROC_SERVER,).unwrap(); // Set the progress to 50%. itbl.SetProgressValue(hwnd,50,100) .unwrap(); // Set the color to yellow. itbl.SetProgressState(hwnd,shell::co::TBPF::PAUSED) .unwrap(); 语句;其中 2 个在您的 SELECT Expression 中。 CASE 是一个伪表,其定义由以 VIEW 结尾的 single 语句定义。此处有 2/3 条语句,因此它不是 SELECT 的有效定义。

接下来,正如我所强调的,VIEW 是 T-SQL 中的一个表达式不是一个语句。 T-SQL 支持 CASE (Case) 语句,只支持 Switch 表达式。 CASE 表达式返回一个标量值;不是语句,不是布尔结果。这意味着您只能从表达式中返回一个原子值,因此每个表达式 CASEWHEN 也必须产生一个标量值。

但是,看看您在这里尝试的内容,我什至不确定它是否属于 ELSE。它不引用任何表,通常 VIEW 会引用。我个人建议将其作为内联表值函数更好,它(如果我理解您正确尝试的内容)看起来像这样:

VIEW

我还整理了您的一些 SQL> 例如,我对 CREATE FUNCTION dbo.YourFunction() RETURNS TABLE AS RETURN SELECT CASE V.DayName WHEN 'Sunday' THEN DATEPART(YEAR,DATEADD(DAY,-7,GETDATE())) --I suggest leaving this as a strongly typed int ELSE DATEPART(YEAR,GETDATE())) --I suggest leaving this as a strongly typed int END AS [Year],CASE V.DayName WHEN 'Sunday' THEN DATEPART(WEEK,GETDATE())) --I suggest leaving this as a strongly typed int ELSE DATEPART(WEEK,GETDATE())) END AS [Week] FROM (VALUES(DATENAME(WEEKDAY,DATEADD(YEAR,DATEDIFF(YEAR,GETDATE()),0))))V(DayName); GO YEAR 等日期部分始终使用相同的关键字(您同时使用了 WEEK 和 {{1} } 表示年份),并将将日期视为 yy 的逻辑替换为显式 yyyy 逻辑,因为它适用于任何日期和时间数据类型(不仅仅是旧的int 数据类型)。

然后你会像这样调用函数:

DATEADD