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'。我一直在做,當我想看到一些插入並忽略我的特效中的其他人。而在某些情況下,如果我想將它們傳遞出去,則可以設置一個輸出變量或簡單選擇一個返回的最終行數。
你的問題實際上與'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