SQL Server中CASE语句赋值变量报错:FROM关键字附近语法错误
问题分析与解决
你的错误源于CASE语句的逻辑分支嵌套错误——你把针对@Test='No'的分支逻辑错误地嵌入到了@Test='YES'分支的字符串拼接内容里,导致SQL解析器在解析到from关键字时,前面的CASE结构没有正确闭合,触发了语法错误。
修正后的代码
DECLARE @Test VARCHAR(10)='Yes'; DECLARE @strTest VARCHAR(max); DECLARE @Project_Id INT = -- 这里替换为你的项目ID实际值 SELECT @strTest = CASE -- 当@Test为YES时,拼接Column1和Column2的内容 WHEN @Test = 'YES' THEN '{ status:"' + ISNULL(column1,'') + '", dateLabel:'''+ CASE WHEN column1='complete' THEN ISNULL(CAST(column1_dt AS VARCHAR(30)),'') ELSE ISNULL(column1_owner,'') END + ''', title: ''''Initiate Column1 '''' + '},' + '{ status:"' + ISNULL(column2,'') + '", dateLabel:'''+ CASE WHEN column2='complete' THEN ISNULL(CAST(column2_dt AS VARCHAR(30)),'') ELSE ISNULL(column2_owner,'') END + ''', title: ''''Update Column2'''' + '}' -- 当@Test为No或Null时,只拼接Column1的内容 WHEN @Test = 'No' OR @Test IS NULL THEN '{ status:"' + ISNULL(column1,'') + '", dateLabel:'''+ CASE WHEN column1='complete' THEN ISNULL(CAST(column1_dt AS VARCHAR(30)),'') ELSE ISNULL(column1_owner,'') END + ''', title: ''''Initiate Column1 '''' + '}' -- 默认空值(如果@Test是其他非预期值) ELSE '' END FROM [Project] WHERE project_id = @Project_Id;
关键修正点
- 理顺CASE逻辑层级:将原本错误嵌套在
@Test='YES'分支里的@Test='No'分支逻辑,移到外层CASE的独立WHEN分支中,确保整个CASE结构在FROM关键字前正确闭合。 - 修正单引号转义:SQL中字符串内的单引号需要用两个单引号转义(比如
''''Initiate Column1 ''''),修复了原代码中可能存在的单引号配对问题。 - 优化JSON格式:移除了原代码中YES分支末尾多余的逗号,保证拼接出的内容符合JSON对象数组的格式规范。
另外提醒:如果@Project_Id对应的数据表存在多行记录,变量@strTest会被最后一行的结果覆盖。如果需要拼接所有行的内容,可以改用STRING_AGG函数或者循环拼接的方式,根据你的实际业务需求调整。
内容的提问来源于stack exchange,提问作者Bhushan
相关产品推荐
相关产品推荐

