2

何が起こっているのかわかりません。

これによりエラーが発生します

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

メイン コメントに 2 つのネストされたコメントがある場合、' 記号を使用できないのはなぜですか? VS Sql 比較を使用して db スクリプトを生成するこのバグを発見しました。これ以降、他の GO を実行することはできません。

Sql Management を使用する代わりに、GO なしで単一の sp_test スクリプトを生成します。

4

2 に答える 2

1

これは、SQL Server Management Studio のバグに違いありません。

このGOステートメントは、SQL Server が処理方法を知っている実際のステートメントではなく、Management Studio やコマンド ライン クライアントなどのエディターが大きなクエリを小さな断片に区切るために使用する規則です。

これらの小さなピースは、順番に 1 つずつ実行されます。

そのため、GOコマンドが実際に SQL Server に送信されて実行される場合、SQL Server はそれを処理する方法がわからないため、エラーが発生します。

Management Studio 2014 では、ネストされたコメントで構文の色分けは問題ありませんが、内部にアポストロフィが存在すると、クエリをより小さな部分に区切ろうとするコードがつまずきます。

そのため、ここでのバグは、ステートメントで分割しようとするコードがGO実際にはネストされたコメントをサポートしていないため、それらの存在によってつまずくということだと思います。基本的に、コメントは inner の後に終了すると考えているようですが*/、これは間違っています。アポストロフィは、GOコマンドを含む後続のすべてをカプセル化する、終わりのない文字列の開始と見なされます。

したがって、アポストロフィの後のすべてが SQL Server に送信されます。SQL Server はネストされたコメントをサポートしているため、GOコマンドがステートメントとして認識されますが、サポートされていないため、エラーが発生します。


ここで Microsoft Connect を使用してこれを報告しました: SQL Server 2014 Management Studio, when delimiting on GO command, does not handle nested comments

于 2016-09-09T08:39:20.383 に答える
0

SQL Server 自体はネストされたブロック コメントを許可していますが、SSMS、SQLCMD.EXE、および場合によっては SMO で使用されるバッチ解析コードには、これらのネストされたブロック コメントを完全には処理しないというバグがあります。そのコードはそれらをある程度処理するため、「完全に」強調します。それはすべて、それらがどのようにネストされているか、および埋め込みGOまたはアポストロフィなどがどこにあるかによって異なります。一部の組み合わせは機能しますが、他の組み合わせは機能しません。たとえば、2番目のネストされたコメントを追加したため、次の非動作テストの適応は機能します。

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

私はこのバグを 3 月に Microsoft Connect に投稿しましたが、悲しいことに、開発者に専念させるのに十分な優先度があると見なされることはないと思います。

ネストされたブロック コメントの後半の「GO」は、SSMS および SQLCMD でのバッチ解析を中断します

PS 古い OSQL.EXE には、この特定の解析の問題はないようですが、使用はお勧めしません ;-)。

于 2016-09-09T16:45:51.640 に答える