当 IDENTITY_INSERT
设置为 OFF 时,为什么我在执行插入时会出错?
如何在 SQL Server 2008 中正确打开它?是通过使用 SQL Server Management Studio 吗?
我已经运行了这个查询:
SET IDENTITY_INSERT Database. dbo. Baskets ON
然后我在控制台中收到命令成功完成的消息。但是,当我运行该应用程序时,它仍然给我如下所示的错误:
Cannot insert explicit value for identity column in table 'Baskets' when
IDENTITY_INSERT is set to OFF.
根据 MSDN 通过 SQL
SET IDENTITY_INSERT sometableWithIdentity ON
INSERT INTO sometableWithIdentity
(IdentityColumn, col2, col3, ...)
VALUES
(AnIdentityValue, col2value, col3value, ...)
SET IDENTITY_INSERT sometableWithIdentity OFF
完整的错误消息会告诉您究竟出了什么问题...
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“sometableWithIdentity”中插入标识列的显式值。
我遇到了一个问题,即使在将 IDENTITY_INSERT 设置为 ON 之后,它也不允许我插入它。
问题是我没有指定列名,并且由于某种原因它不喜欢它。
INSERT INTO tbl Values(vals)
所以基本上做完整的 INSERT INTO tbl(cols) Values(vals)
导入:您必须在 INSERT
语句中写入列
INSERT INTO TABLE
SELECT * FROM
是不正确的。
Insert into Table(Field1,...)
Select (Field1,...) from TABLE
是正确的
我知道这是一个较旧的线程,但我只是碰到了这个。如果用户在其他会话设置 IDENTITY_INSERT ON 之后尝试在 Identity 列上运行插入,那么他一定会收到上述错误。
设置标识插入值和随后的插入 DML 命令将由同一会话运行。
在这里,@Beginner 将 Identity Insert 单独设置为 ON,然后从他的应用程序运行插入。这就是为什么他得到以下错误:
Cannot insert explicit value for identity column in table 'Baskets' when
IDENTITY_INSERT is set to OFF.
看起来有必要在每个 SQL INSERT
发送批次之前放置一个 SET IDENTITY_INSERT Database.dbo.Baskets ON;
。
您可以发送多个以一个 SET IDENTITY_INSERT ... ON;
字符串开头的 INSERT ... VALUES ...
命令。只是不要在两者之间放置任何批次分隔符。
我不知道为什么 SET IDENTITY_INSERT ... ON
在发送块之后停止工作(例如:C# 中的 .ExecuteNonQuery()
)。我不得不再次将 SET IDENTITY_INSERT ... ON;
放在下一个 SQL 命令字符串的开头。
这很可能是当您有一个 PRIMARY KEY 字段并且您正在插入一个重复的值或者您将 INSERT_IDENTITY 标志设置为 on
另一种选择是你有像'type'或'status'这样的表,例如OrderStatus,你总是想要控制Id值,创建Id(主键)列而不是Identity列是第一位的。
不定期副业成功案例分享