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