CREATE VIEW [Myview] AS
SELECT
CASE
WHEN
DATENAME(dw,DATEADD(yy, DATEDIFF(yy, 0, 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,
RIGHT('00'+cast(DATEPART(ww, getdate()-14) as varchar(2)),2) as WEEK;
GO
<块引用>
创建时出错:消息 103010,级别 16,状态 1,第 1 行解析 第 8 行错误,第 3 列:“SELECT”附近的语法不正确。
帮我解决这个错误。 我想检查一年的第一天是否是星期日,然后我会遵循 then 声明。然后语句建议获取周 ID 和年份。enter image description here
答案 0 :(得分:1)
您的 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
表达式返回一个标量值;不是语句,不是布尔结果。这意味着您只能从表达式中返回一个原子值,因此每个表达式 CASE
和 WHEN
也必须产生一个标量值。
但是,看看您在这里尝试的内容,我什至不确定它是否属于 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, DATEADD(DAY, -7,GETDATE())) --I suggest leaving this as a strongly typed int
END AS [Year],
CASE V.DayName WHEN 'Sunday' THEN DATEPART(WEEK, DATEADD(DAY, -7,GETDATE())) --I suggest leaving this as a strongly typed int
ELSE DATEPART(WEEK, DATEADD(DAY, -7,GETDATE()))
END AS [Week]
FROM (VALUES(DATENAME(WEEKDAY,DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))))V(DayName);
GO
和 YEAR
等日期部分始终使用相同的关键字(您同时使用了 WEEK
和 {{1} } 表示年份),并将将日期视为 yy
的逻辑替换为显式 yyyy
逻辑,因为它适用于任何日期和时间数据类型(不仅仅是旧的int
数据类型)。
然后你会像这样调用函数:
DATEADD