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
相关产品推荐
相关产品推荐

