You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL报错:关键字‘IN’附近语法不正确,附出错代码

排查并解决SQL中的"Incorrect syntax near the keyword 'IN'"错误

咱们一步一步拆解你的问题:

1. 直接导致语法报错的核心原因

你写的这行代码完全不符合SQL语法规则:

SET @DateFrom = DATENAME(DW, @DateFrom) IN ( 'tuesday','friday',null)

SET是用来给变量赋值的,但DATENAME(DW, @DateFrom) IN (...)是一个布尔判断表达式(只会返回true或false),既不能直接赋值给DateTime类型的@DateFrom变量,写法本身也逻辑混乱——你应该是想判断当前日期是否是周二/周五,而不是把判断结果赋值给日期变量。

2. 隐藏的循环逻辑错误

你的WHILE条件写反了:

WHILE @DateTo < @DateFrom

@DateTo是2018-05-31,@DateFrom是2018-04-01,这个条件永远为false,循环根本不会执行。正确的条件应该是WHILE @DateFrom <= @DateTo,这样才能从起始日期遍历到结束日期。

3. 变量类型不匹配问题

DATENAME(DW, @DateFrom)返回的是字符串(比如'Tuesday'),而@DateFrom是DateTime类型,就算你强行赋值,也会触发类型不兼容的错误。


修正后的代码(假设你要遍历日期范围,处理周二/周五的日期)

DECLARE @DateFrom DateTime = '2018-04-01', 
        @DateTo DateTime = '2018-05-31'

-- 修正循环条件:从起始日期遍历到结束日期
WHILE @DateFrom <= @DateTo 
BEGIN 
    -- 判断当前日期是否是周二或周五
    IF DATENAME(DW, @DateFrom) IN ('Tuesday', 'Friday')
    BEGIN
        -- 这里替换成你实际需要执行的操作,比如插入数据、计算统计值等
        PRINT '正在处理日期:' + CONVERT(VARCHAR, @DateFrom, 23)
    END

    -- 日期自增1天,推进循环
    SET @DateFrom = DATEADD(DAY, 1, @DateFrom)
END

修正点说明

  • 调整了WHILE循环条件,确保循环能正常执行
  • 用IF语句替代错误的SET+IN写法,正确实现星期判断逻辑
  • 将日期自增操作放在循环末尾,避免死循环
  • 移除了null(因为DATENAME不会返回null,除非@DateFrom本身是null,如果需要处理这种情况,可以单独添加IF @DateFrom IS NULL的判断)

内容的提问来源于stack exchange,提问作者prasanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:34:05