'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 似乎没有这个特定的解析问题,但我仍然不建议使用它 ;-).
我不明白发生了什么。
这会产生错误
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 似乎没有这个特定的解析问题,但我仍然不建议使用它 ;-).