在SET IDENTITY_INSERT之前和之后需要GO到ON / OFF

时间:2014-01-23 08:34:20

标签: sql-server

我是否需要在SET IDENTITY_INSERT之前和之后进行ON / OFF?

我看到了很多样本​​,文章使用了这个,但是当我跳过GO时,脚本运行正常。

GO
SET IDENTITY_INSERT [PropertyValue] ON
GO

-- Some script

GO
SET IDENTITY_INSERT [PropertyValue] OFF
GO

我想知道这是否是一个很好的代码转换。

2 个答案:

答案 0 :(得分:3)

你不需要。 GO指示例如。 SQL Server Management Studio将查询作为单独的命令执行。有些条款需要这个,有些则不需要。

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

编辑:正如Damien所指出的那样,现在已经不再是这样了。 CREATE TABLE之后可以INSERTDROP TABLE就好了,同样适用于CREATE PROCEDURE和其他人。一直在改进,嗯? :)我已经尝试了其他一些我记得的情况,似乎你不再需要set identity_insert作为命令中的最后一个语句。时代变了:)

GO不需要GO分隔。当你自动生成SQL代码时,它通常被用作安全的做法,因为你不一定知道其他地方发生了什么(例如,你可能在前一个子句中创建了表,所以可以肯定的是,你放了一个{在身份插入之前{1}}。但是,如果您在手工编写的SQL中使用它作为一个批处理,则没有必要,并且不会产生任何特定的好处。

答案 1 :(得分:3)

GO不是Transact-SQL语句;它是sqlcmdosql实用程序以及SQL Server Management Studio代码编辑器可识别的命令。 SQL Server实用程序将GO解释为它们应将当前批处理的Transact-SQL语句发送到SQL Server实例的信号。当前批处理语句由自上一个GO以来输入的所有语句组成,或者自ad hoc会话或脚本开始以来(如果这是第一个GO)。 Transact-SQL语句不能与GO命令占用同一行。但是,该行可以包含注释。 用户必须遵守批次规则。例如,批处理中第一个语句之后的任何存储过程的执行都必须包含EXECUTE关键字。本地(用户定义)变量的范围仅限于批处理,并且在GO命令后无法引用。