SQL Server创建存储过程提示';'附近语法错误如何解决
错误原因
- 直接触发报错的原因是批处理分隔符使用不规范:
GO是SSMS、sqlcmd这类SQL Server客户端工具识别的批处理边界标记,不属于T-SQL标准语法,必须单独占一行,后面不能接分号。你代码中写的GO;会被T-SQL解析器判定为非法语法,抛出102号语法错误。 - 代码存在隐性语法歧义风险:公用表表达式(CTE)的
WITH关键字如果没有和前面的语句做明确终止,会被解析器误认为是查询提示(如表锁提示WITH (NOLOCK))的开头,属于不规范写法,在部分场景下也会触发语法错误。 - 额外优化点:
COUNT(Message)没有指定别名,返回的结果集对应列会显示无列名,不便于后续结果读取。
修正后可直接运行的代码
CREATE PROCEDURE GetValues @ValueName nvarchar(256) AS -- CTE前加;明确标记语句终止,避免解析歧义 ;WITH tmpTable AS ( SELECT * FROM myTable WHERE (Value = @ValueName AND Message IS NOT NULL) ) SELECT Message, COUNT(Message) AS MessageCount FROM tmpTable GROUP BY Message GO -- 移除GO后的分号,保证GO单独成行 EXEC GetValues @ValueName = 'myvalue';
直接在SSMS中执行上述代码即可正常创建存储过程并返回统计结果,不会再出现分号附近的语法报错。
内容的提问来源于stack exchange,提问作者flashburn
相关产品推荐
相关产品推荐

