'go' 附近的语法不正确 - 不能将 ' 放入双注释中

incorrect syntax near 'go' - can t have ' into double comment

我不明白发生了什么。

这会产生错误

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

"Msg 102, Level 15, State 1, Procedure sp_test, Line 13 Incorrect syntax near 'go'."

虽然这有效

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

为什么如果我在主评论中有两个嵌套评论,我不能有 ' 符号? 我发现这个错误是使用 VS Sql compare 来生成数据库脚本的,在此之后不可能有任何其他的 GO。

而不是使用 Sql 管理,它将生成没有 GO 的单个 sp_test 脚本..

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

GO 语句不是 SQL 服务器知道如何处理的真正语句,而是编辑器(例如 Management Studio 和命令行客户端)用来将大查询分隔成的约定小块。

然后这些小块按顺序一个接一个执行。

因此,如果 GO 命令实际上被发送到 SQL 服务器执行,它将不知道如何处理它,从而给你你得到的错误。

在 Management Studio 2014 中,嵌套注释的语法着色没问题,但内部撇号的存在会使试图将查询分隔成更小部分的代码出错。

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

因此撇号后的所有内容都会发送到 SQL 服务器。 SQL 服务器确实支持嵌套注释,因此它会将 GO 命令视为它不支持的语句,因此会出现错误。


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

虽然 SQL 服务器本身允许嵌套块注释,但 SSMS SQLCMD.EXE 和可能的 SMO 使用的批处理代码有一个错误,无法处理这些嵌套块评论完全。我强调 "entirely" 因为该代码将在一定程度上处理它们。这完全取决于它们的嵌套方式以及嵌入 GO 或撇号等的位置。有些组合有效,有些则无效。例如,您的非工作测试的以下改编确实有效,因为我添加了第二个嵌套评论:

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

我在 3 月份将此错误发布到 Microsoft Connect,但我怀疑它是否会被视为具有足够的优先级来让开发人员关注,遗憾的是:

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

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