2013-03-15 42 views
1

這是關於NOCOUNT語句的用法和語義的小問題。我已經看到它使用了兩種不同的方式,我想知道實際需要或不需要。sql的語義NOCOUNT

我已經看到了上市的MSDN與尾隨分號和GO語句像這樣:

SET NOCOUNT ON; 
GO 

,我已經看到了沒有尾隨分號:

SET NOCOUNT ON 
GO 

和我我看到它沒有GO語句

SET NOCOUNT ON 

我意識到GO只是signa ls是批次的結尾,但是爲了讓NOCOUNT生效,應該調用它嗎?

分號的意義是什麼?

+1

你的問題實際上與'SET NOCOUNT ON'無關:你實際上在問什麼時候使用分號以及何時使用'GO'。這兩個問題已被回答:[這裏](http://stackoverflow.com/questions/710683/when-should-i-use-semicolons-in-sql-server)和[這裏](http:// stackoverflow。 COM /問題/ 2668529/T-SQL-GO-語句)。當然,您也可以閱讀文檔:[here](http://msdn.microsoft.com/en-us/library/ms177563.aspx)和[here](http://msdn.microsoft.com/zh-cn/ -us /庫/ ms175972.aspx)。 – Pondlife 2013-03-15 18:53:16

回答

0

分號結束當前的SQL語句。

據我所知,SET NOCOUNT ON後不需要。

您不應該需要'GO'來讓NOCOUNT生效,但我不太確定。

+3

關於SET NOCOUNT ON之後是否需要這取決於後面的內容。例如'SET NOCOUNT ON; WITH T(C)AS(SELECT 1)SELECT * FROM T;'。不使用分號作爲語句終止符已被棄用。 – 2013-03-15 17:19:40

0

A';'是一個記憶終結者,我總是這樣做,而GO語句是一個批終止符。

所以,如果你DDL創建,如創建一個進程,視圖,函數或其他對象,你可以做一個像一堆:

創建PROC等等作爲.... GO

創建PROC blah2 as .... GO

然後你可以有一個很好的創建腳本。如果你沒有GO的話,它會像下面這樣說:「創建(東西)必須是創建中的第一個語句......」這意味着SQL認爲你正在爲這兩者執行單個操作。 '去'說:「新範圍,新對象」。所以它可以解決這個問題。如果您查看pubs和Northwind(舊的MS測試數據庫)的創建腳本,我相信他們都將批終止符用於單個'* .sql'文件。它可以在一個文件中創建一堆創作。

A;只會終止內存直至聲明。大多數時候可以忽略它們,但是一些SQL專家會知道你無法擺脫這個問題的很大一部分就是...... CTE!

是的,CTE會立即對你大叫,因爲它以'with'開頭,但你也可以用'with'使用(nolock)提示,所以它需要區分兩個交易,THUS你應該使用' ;」。

EG:

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的引擎認爲這是:

設置不預ON; - 不,謝謝引擎,我不需要看計數\ n設置事務級隔離級別讀取未提交; \ n--將我設置爲默認讀取髒讀\ n \ n從表格中選擇\ n * \ n \ n; \ n \ n從表格2選擇\ n * \ n \ n;

所以它需要一個人告訴它在哪裏空白終止一點幫助。否則它不是人類,不知道一個聲明停在哪裏,另一個聲明開始。

無論你做什麼,如果你正在爲他人寫作,並根據明確的指導原則,我總是被告知要做';'終結者使其正式結束序列。

一去就是一個批處理終止,但你可以改變它的上下文,這使得它可用於切換的數據庫,如:

使用數據庫1 從TableOnDatabase1 GO

選擇*;

使用的Database2 GO

從TableOnDatabase2選擇*;

而且節省空間我做了一個單一的線,但真的是你應該在單獨的行做你的主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'。我一直在做,當我想看到一些插入並忽略我的特效中的其他人。而在某些情況下,如果我想將它們傳遞出去,則可以設置一個輸出變量或簡單選擇一個返回的最終行數。