Sql Server 关于SET IDENTITY_INSERT的问题 (转载)

想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,须要设定 SET IDENTITY_INSERT
示例:html

 

1.首先创建一个有标识列的表:spa

CREATE TABLE products ( id int IDENTITY PRIMARY KEY, product varchar(40) )

 

2.尝试在表中作如下操做:code

INSERT INTO products (id, product) VALUES(3, 'garden shovel')

结果会致使错误:“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。”htm

 

3.改用:blog

SET IDENTITY_INSERT products ON 
INSERT INTO products (id, product) VALUES(1, 'garden shovel')

返回正确。get

 

4.创建另一个表products2,尝试相同插入操做:class

CREATE TABLE products2 ( id int IDENTITY PRIMARY KEY, product varchar(40) )

而后执行:im

SET IDENTITY_INSERT products2 ON 
INSERT INTO products2 (id, product) VALUES(1, 'garden shovel')

致使错误:“表 'material.dbo.products' 的 IDENTITY_INSERT 已经为 ON。没法对表 'products2' 执行 SET 操做。”总结

改成执行:db

SET IDENTITY_INSERT products OFF 
SET IDENTITY_INSERT products2 ON 
INSERT INTO products2 (id, product) VALUES(2, 'garden shovel')

执行经过。

 

5.尝试如下操做:

SET IDENTITY_INSERT products2 ON 

INSERT INTO products2 SELECT * FROM products SET IDENTITY_INSERT products2 OFF

致使错误:“仅当使用了列的列表,而且 IDENTITY_INSERT 为 ON 时,才能在表 'products2' 中为标识列指定显式值。”

 

6.改成:

SET IDENTITY_INSERT products2 ON 

INSERT INTO products2(id, product) SELECT * FROM products SET IDENTITY_INSERT products2 OFF

执行经过。

 

7.IDENTITY列不必定非要是主键或惟一键列,实际上做为IDENTITY的列只要求不能为空,可是IDENTITY列默认状况下是能够有重复值的,咱们来看下面的SQL语句:

CREATE TABLE [dbo].[DemoPerson]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Age] [int] NULL ) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[DemoPerson] ON

INSERT INTO [dbo].[DemoPerson]([ID],[Name],[Age]) VALUES (1,N'Jack',31), (1,N'Jack',31), (2,N'Bob',32), (2,N'Bob',32), (3,N'Sam',33), (3,N'Sam',33) SET IDENTITY_INSERT [dbo].[DemoPerson] OFF

SELECT * FROM [dbo].[DemoPerson] 

INSERT INTO [dbo].[DemoPerson]([Name],[Age]) VALUES (N'Tom',35) SELECT * FROM [dbo].[DemoPerson]

执行结果以下:

 

 

总结:

  1. 每一次链接会话中的任一时刻,只能对一个表设置IDENTITY_INSERT ON,且设置只对当前会话有效
  2. 在对标识列执行插入操做进,必定要列出此标识列(固然,同时也就须要列出相关的其余列了)。
  3. 任什么时候候,会话中只有一个表的 IDENTITY_INSERT 属性能够设置为 ON。若是某个表已将此属性设置为 ON,而且为另外一个表发出了 SET IDENTITY_INSERT ON 语句,则 Microsoft® SQL Server™ 返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON 并报告此属性已设置为 ON 的表。
  4. 若是插入值大于表的当前标识值,则 SQL Server 自动将新插入值做为当前标识值使用。
  5. SET IDENTITY_INSERT 的设置是在执行或运行时设置,而不是在分析时设置。

 

原文连接

相关文章
相关标签/搜索