我是否需要在SET IDENTITY_INSERT之前和之后进行ON / OFF?
我看到了很多样本,文章使用了这个,但是当我跳过GO时,脚本运行正常。
GO
SET IDENTITY_INSERT [PropertyValue] ON
GO
-- Some script
GO
SET IDENTITY_INSERT [PropertyValue] OFF
GO
我想知道这是否是一个很好的代码转换。
答案 0 :(得分:3)
你不需要。 GO
指示例如。 SQL Server Management Studio将查询作为单独的命令执行。有些条款需要这个,有些则不需要。
例如,通常需要使用GO
将CREATE TABLE
子句与INSERT
分隔到同一个表中。
编辑:正如Damien所指出的那样,现在已经不再是这样了。 CREATE TABLE
之后可以INSERT
,DROP TABLE
就好了,同样适用于CREATE PROCEDURE
和其他人。一直在改进,嗯? :)我已经尝试了其他一些我记得的情况,似乎你不再需要set identity_insert
作为命令中的最后一个语句。时代变了:)
GO
不需要GO
分隔。当你自动生成SQL代码时,它通常被用作安全的做法,因为你不一定知道其他地方发生了什么(例如,你可能在前一个子句中创建了表,所以可以肯定的是,你放了一个{在身份插入之前{1}}。但是,如果您在手工编写的SQL中使用它作为一个批处理,则没有必要,并且不会产生任何特定的好处。
答案 1 :(得分:3)
GO
不是Transact-SQL语句;它是sqlcmd
和osql
实用程序以及SQL Server Management Studio代码编辑器可识别的命令。
SQL Server实用程序将GO
解释为它们应将当前批处理的Transact-SQL语句发送到SQL Server实例的信号。当前批处理语句由自上一个GO
以来输入的所有语句组成,或者自ad hoc会话或脚本开始以来(如果这是第一个GO
)。
Transact-SQL语句不能与GO
命令占用同一行。但是,该行可以包含注释。
用户必须遵守批次规则。例如,批处理中第一个语句之后的任何存储过程的执行都必须包含EXECUTE
关键字。本地(用户定义)变量的范围仅限于批处理,并且在GO
命令后无法引用。