【问题标题】:Inserting Data with Identity_Insert is ON with Insert into Table1 Select * from Table2使用 Identity_Insert 插入数据为 ON 并插入 Table1 Select * from Table2
【发布时间】:2012-10-02 18:24:20
【问题描述】:
CREATE TABLE TestTable (id int IDENTITY (1,1), name nvarchar(100));
INSERT INTO TestTable(name) VALUES ('data1');                     
INSERT INTO TestTable(name) VALUES ('data2');                       
Declare @Identity as int
set @identity=IDENT_CURRENT ('TestTable') 
SET IDENTITY_INSERT TestTable ON;

我怎样才能实现这个功能?

INSERT INTO TestTable
Select * from 
(
Select 55 as a,'data55' as b
Union
Select 56 as a,'data55' as b
)n

当它被替换时.. 消息 8101,第 16 层,状态 1,第 7 行 只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“TestTable”中的标识列指定显式值。

INSERT INTO TestTable (id, name) VALUES (55, 'data55');     
INSERT INTO TestTable (id, name) VALUES (56, 'data55');    

SET IDENTITY_INSERT TestTable OFF;
DBCC CHECKIDENT (TestTable, reseed,@identity )
INSERT INTO TestTable(name) VALUES ('data3');                 
Select * from TestTable 
Drop table TestTable

【问题讨论】:

  • 再次阅读错误信息:“...只能在使用列列表时指定并且 IDENTITY_INSERT 为ON。”。在您的联合示例中,您没有提供列列表。

标签: sql identity


【解决方案1】:

你需要说

INSERT INTO TestTable (id, name)
Select * from  
( 
Select 55 as a,'data55' as b 
Union 
Select 56 as a,'data55' as b 
)n 

【讨论】:

  • 我的要求是一辆法拉利和国内的豪宅。这不会影响语言的规则。
【解决方案2】:

这应该可以正常工作:

SET IDENTITY_INSERT TestTable ON;

INSERT INTO TestTable(id, name)
Select * 
from 
( 
    Select 55 as a, 'data55' as b 
    Union 
    Select 56 as a, 'data55' as b 
)n;

只需将SET IDENTITY_INSERT ON 设置为INSERT 子句中列出的字段即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多