' go'附近的语法不正确 - 不能有'双重评论

时间:2016-09-09 08:29:48

标签: sql-server visual-studio sql-manager

我不明白发生了什么。

这会产生错误

create procedure sp_test
as
/*
   /*
      a
   */
   e'
*/
begin
print''
end
go
  

"消息102,级别15,状态1,过程sp_test,第13行       ' go'附近的语法不正确。"

虽然这有效

create procedure sp_test
as
/*
   /*
      a
   */
   e
*/
begin
print''
end
go

为什么我在主评论中有两个嵌套评论我无法做到?符号? 我发现这个bug使用VS Sql比较来生成db脚本,并且在此之后不可能有任何其他GO。

相反,使用Sql Management,它将生成单个sp_test脚本而不使用GO ..

2 个答案:

答案 0 :(得分:1)

这必定是SQL Server Management Studio中的错误。

GO语句不是SQL Server知道如何处理的真实语句,而是一种编辑器(如Management Studio和命令行客户端)用来将大查询划分为更小块的约定。

然后按顺序逐个执行这些较小的部分。

因此,如果GO命令实际发送到SQL Server执行,它将不知道如何处理它,从而为您提供错误。

在Management Studio 2014中,嵌套注释的语法着色很好,但撇号内部的存在会使尝试将查询划分为更小块的代码跳闸。

因此我认为这里的错误是试图在GO语句上拆分的代码实际上并不支持嵌套的注释,因此它们的存在会使它绊倒。基本上它似乎认为注释在内部*/之后结束,这是错误的,然后撇号被认为是一个没有结束的字符串的开头,然后封装后面的所有内容,包括{{1} }命令。

因此,撇号之后的所有内容都将发送到SQL Server。 SQL Server确实支持嵌套注释,因此它会将GO命令视为一个它不支持的语句,从而错误。

我在此处使用Microsoft Connect报告此内容:SQL Server 2014 Management Studio, when delimiting on GO command, doesn't handle nested comments

答案 1 :(得分:0)

虽然SQL Server本身允许嵌套块注释,但SSMS,SQLCMD.EXE和可能的SMO使用的批处理解析代码中有一个错误,它不能完全处理这些嵌套块注释 / em>的。我强调"完全"因为该代码将在一定程度上处理它们。这一切都取决于它们是如何嵌套的以及嵌入的GO或撇号等的位置。有些组合有效,有些则没有。例如,以下对非工作测试的调整确实有效,因为我添加了第二个嵌套注释:

create procedure sp_test
as
/*
   /*
      a
   */
   /*
   e'
   */
*/
begin
print''
end
go

我在三月份将这个错误发布给了Microsoft Connect,但我怀疑它是否会被视为有足够的优先权来投入开发人员,遗憾的是:

"GO" in 2nd half of nested block comments breaks batch parsing in SSMS and SQLCMD

P.S。应该注意的是,较旧的OSQL.EXE似乎没有这个特殊的解析问题,但我仍然不建议使用它; - )。