2014-01-23 35 views
2

在SET IDENTITY_INSERT開啓/關閉之前和之後,是否需要GO?在SET IDENTITY_INSERT開啓/關閉之前和之後是否需要GO

我看到很多樣品,文章使用這個,但是當我跳過去時,腳本工作正常。

GO 
SET IDENTITY_INSERT [PropertyValue] ON 
GO 

-- Some script 

GO 
SET IDENTITY_INSERT [PropertyValue] OFF 
GO 

我不知道這是否是一個很好的代碼轉換。

回答

2

你不需要。 GO指示例如。 SQL Server Management Studio將執行查詢作爲單獨的命令。有些條款需要這個,有些則不需要。

例如,通常需要使用GOCREATE TABLE子句從INSERT s分隔到同一個表中。

編輯:似乎不再是這種情況,正如Damien指出的那樣。 CREATE TABLE後面跟着INSERT就好了,同樣適用於DROP TABLE等。總是在改進,呃? :)我已經嘗試了一些我記得的其他案例,看起來你不再需要在命令中使用CREATE PROCEDURE作爲最後一條語句。時代改變:)

set identity_insert不需要被GO分開。當你自動生成SQL代碼時,它通常用作安全實踐,因爲你不一定知道其他地方發生了什麼(例如,你可能在前面的子句中創建了表,所以可以肯定的是,你把GO在身份插入之前)。但是這並不是必要的,如果你用手寫的SQL作爲一個批處理執行,它不會產生任何特定的好處。

+3

我不同意你選擇的例子。 '創建表T(ID int not null);插入到T(ID)值(1)中;'(甚至全部在一行上)運行良好。 –

+0

@Damien_The_Unbeliever:哈,你說得對。時代在變。我記得過去一段時間(MS SQL 2000?)是不可能的,因爲它不能創建查詢計劃,因爲表不存在。看來這個特殊限制現在已經消失了。這是非常有用的,謝謝:) – Luaan

+0

謝謝,我覺得GO是煩人的。我不需要這個。 –

3

GO不是Transact-SQL語句;它是由sqlcmdosql實用程序和SQL Server Management Studio代碼編輯器識別的命令。 SQL Server實用程序將GO解釋爲應將當前批次的Transact-SQL語句發送到SQL Server實例的信號。當前批次報表包含自上次GO以來輸入的所有報表,或自特設會話或腳本開始以來輸入的所有報表,如果這是第一個GO。 Transact-SQL語句不能佔用與GO命令相同的行。但是,該行可以包含註釋。 用戶必須遵守批次規則。例如,批次中的第一條語句之後的任何存儲過程的執行都必須包含EXECUTE關鍵字。本地(用戶定義的)變量的範圍限於批處理,並且在命令GO後不能被引用。

+0

當您從官方文檔複製並粘貼您的回覆時,您應該引用來源:https://msdn.microsoft.com/en-us/library/ms188037.aspx – Quercus

相關問題