聲明:本博文摘自http://www.lmwlove.com/ac/ID500
自增列默認是不能插入顯式值的,當我們試圖給自增列插入值時,會報以下錯誤:
當 IDENTITY_INSERT 設置為 OFF 時,不能為表 'table1' 中的標識列插入顯式值。
如果我們想為表的自增列插入顯式值,我們可以通過SET IDENTITY_INSERT語法來實現,這在數據轉移的時候尤為有效。
我們先看看IDENTITY_INSERT的語法。
作用:允許將顯式值插入表的標識列中。
語法:SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }
參數:
database_name
指定的表所在的數據庫的名稱。
schema_name
表所屬的架構的名稱。
table
包含標識列的表的名稱。
備注:
任何時候,一個會話中只有一個表的 IDENTITY_INSERT 屬性可以設置為 ON。如果某個表已將此屬性設置為 ON,則對另一個表發出 SET IDENTITY_INSERT ON 語句時,SQL Server 2005 將返回一個錯誤信息,指出 SET IDENTITY_INSERT 已設置為 ON,並報告已將其屬性設置為 ON 的表。
如果插入值大於表的當前標識值,則 SQL Server 自動將新插入值作為當前標識值使用。
SET IDENTITY_INSERT 的設置是在執行或運行時設置的,而不是在分析時設置的。
示例:
我們先創建一個帶有自增列的表:
語法:SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }
參數:
database_name
指定的表所在的數據庫的名稱。
schema_name
表所屬的架構的名稱。
table
包含標識列的表的名稱。
備注:
任何時候,一個會話中只有一個表的 IDENTITY_INSERT 屬性可以設置為 ON。如果某個表已將此屬性設置為 ON,則對另一個表發出 SET IDENTITY_INSERT ON 語句時,SQL Server 2005 將返回一個錯誤信息,指出 SET IDENTITY_INSERT 已設置為 ON,並報告已將其屬性設置為 ON 的表。
如果插入值大於表的當前標識值,則 SQL Server 自動將新插入值作為當前標識值使用。
SET IDENTITY_INSERT 的設置是在執行或運行時設置的,而不是在分析時設置的。
示例:
我們先創建一個帶有自增列的表:
1 create table hr_member(ID int identity(1,1) primary key,name varchar(100))
1 insert into hr_member(id,name) values (1,'wfs')
會報以下的錯誤:
當 IDENTITY_INSERT 設置為 OFF 時,不能為表 'hr_member' 中的標識列插入顯式值。
設置identity_insert的值后再插入數據:
1 set identity_insert hr_member on 2 insert into hr_member(id,name) values (1,'wfs')
執行成功!
注意:在同一個會話中,只能有一個表的identity_insert可以設置為ON。
我們再創建另一個表:
1 create table hr_member_1(ID int identity(1,1) primary key,name varchar(100))
然后執行:
1 set identity_insert hr_member on 2 set identity_insert hr_member_1 on
會報以下的錯誤:
表 'test.dbo.hr_member' 的 IDENTITY_INSERT 已經為 ON。無法為表 'hr_member_1' 執行 SET 操作。
修改代碼:
1 set identity_insert hr_member off 2 set identity_insert hr_member_1 on
執行成功!
注意:我們在在對標識列執行插入操作時,一定要列出此標識列的列名:
如下代碼:
1 set identity_insert hr_member on 2 insert into hr_member 3 select 2,'abc'
會報以下錯誤:
僅當使用了列列表並且 IDENTITY_INSERT 為 ON 時,才能為表'hr_member'中的標識列指定顯式值。
修改代碼:
1 set identity_insert hr_member on 2 insert into hr_member(ID,name) 3 select 2,'abc'
執行成功!
注意:任何set identity_insert 表名 on的設置,都只在當前會話中有效!
轉載於:https://www.cnblogs.com/njl041x/p/3443646.html