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 的設置是在執行或運行時設置,而不是在分析時設置。

 

原文連接

相關文章
相關標籤/搜索