1

NOCOUNTこれは、ステートメントの使用法とセマンティクスに関するマイナーな質問です。私はそれがいくつかの異なる方法を使用しているのを見てきました、そして私は実際に何が必要かどうか知りたいです。

私はそれが次のような末尾のセミコロンとGOステートメントでMSDNにリストされているのを見ました:

SET NOCOUNT ON;
GO

末尾のセミコロンなしで見たことがあります。

SET NOCOUNT ON
GO

そして私はGOステートメントなしでそれを見ました

SET NOCOUNT ON

GO単にバッチの終了を通知するだけだとわかりましたが、を有効にするには、これを呼び出す必要がありますNOCOUNTか?

そして、セミコロンのポイントは何ですか?

4

2 に答える 2

0

A';' はメモリターミネータですが、GOステートメントはバッチターミネータです。

したがって、proc、view、function、またはその他のオブジェクトの作成などのDDL作成を行う場合は、次のような一連の作業を行うことができます。

procblahを....GOとして作成します。

procblah2を....GOとして作成します。

そして、あなたは単一の素晴らしい作成スクリプトを持つことができます。GOがない場合は、「Create(thing)はcreateの最初のステートメントである必要があります...」のように壊れます。これは、SQLが両方に対して単一の操作を実行していると考えたことを意味します。「GO」は、「新しいスコープ、新しいオブジェクト」と言います。だからそれはそれを回避します。パブとNorthwind(古いMSテストデータベース)の作成スクリプトを見ると、それらはすべて単一の「*.sql」ファイルにバッチターミネータを使用していると思います。これにより、1つのファイルで大量の作成が可能になります。

A; ステートメントまでメモリを終了するだけです。ほとんどの場合、それらを省略しても問題ありませんが、SQLの専門家の中には、これから逃れることができないことを知っている大きな場所があります..... CTEです!

はい、CTEは「with」で始まるためすぐに怒鳴りますが、「with」で(nolock)ヒントを使用することもできるため、2つのトランザクションを区別する必要があるため、「;」を使用する必要があります。

例えば:

Select * from table -- standard SQL no biggie

または

Select * from table 
Select * from table2  -- these are fine stacked and will run

だが...

Select * from table
with a as (select * from table2) select * from a

'with'のコンテキストが新しいステートメントに変更されたことを知らなかったため、すぐに壊れます。細心の注意を払っている場合の適切なSQLは、次のようになります。

Set NoCount ON;  -- No thank you engine I don't need to see counts
Set Transaction Level Isolation Level Read Uncommitted;  -- Set me to dirty reads as default

Select 
    * 
from table
;

Select 
  * 
from table2
;

SQLのエンジンはこれを次のように認識します。

NoReadをオンに設定;-カウントを表示する必要がないエンジンに感謝しません\nトランザクションレベルの分離レベルの読み取りをコミット解除に設定します;\n-デフォルトとしてダーティ読み取りに設定します\n\n選択\n*\nテーブルから\n ; \ n\n選択\n*\nテーブル2から\n;

したがって、空白がどこで終了するかを伝える人の助けが少し必要です。そうでなければ、それは人間ではなく、あるステートメントがどこで停止し、別のステートメントがどこから始まったかを知りません。

あなたが他の人のためにそれを書いていて、明確に定義されたガイドラインの下であなたが何をするにしても、私はいつも「;」をするように言われました。それを公式の終了シーケンスにするターミネーター。

GOはバッチターミネータですが、GOを使用してコンテキストを変更できるため、次のようなデータベースの切り替えに役立ちます。

Database1GOを使用する

TableOnDatabase1から*を選択します。

Database2GOを使用する

TableOnDatabase2から*を選択します。

また、スペースを節約するために1行実行しましたが、実際には、メインのSQL構文を別の行で実行し、次のようなサブ構文も実行する必要があります。

Select 
    ColumnA
,   ColumnB
,   count(ColumnC) as cnt
From table
Where thing happens
Group by 
    ColumnA
,   ColumnB
Having Count(ColumnC) > 1
Order by ColumnA

一般的な実世界の例の編集:

set nocount on;

declare @Table table ( ints int);
declare @CursorInt int = 1;

while @CursorInt <= 100 
begin 
  insert into @Table values (@CursorInt)

  set @CursorInt += 1
End

-- wait a second engine you did not tell me what happened in the 'Messages' section?!
-- aw come on I want to see each transaction!

Set nocount off;

while @CursorInt <= 200 
begin 
  insert into @Table values (@CursorInt)

  set @CursorInt += 1
End

-- okay that is annoying I did not have to see 100: "(1 row(s) affected)"

プロシージャのスコープ内で必要なだけメモリターミネータを使用して「nocount」のオンとオフを切り替えることができます。いくつかの挿入を確認し、procで他の挿入を無視したい場合は、常にそれを行います。そして、それらを渡したい場合は、出力変数を設定するか、最終的な行数を単純に選択して返します。

于 2013-03-15T18:56:00.627 に答える
0

セミコロンは、現在のSQLステートメントを終了します。

私の知る限り、SETNOCOUNTONの後には必要ありません。

NOCOUNTを有効にするために、「GO」は必要ありませんが、それについては確信が持てません。

于 2013-03-15T17:16:05.530 に答える