存储过程IDENTITY_INSERT

时间:2011-06-23 13:19:49

标签: asp.net sql sql-server stored-procedures identity-insert

我最近更改了我的数据表,我删除了列并添加了一个新列,定义为identity = True和identity seed = 1,identity increment = 1。 当我试图通过STORE PROCEDURE将数据插入此表时,我得到了这个例外:

只有在使用列列表并且IDENTITY_INSERT为ON时,才能指定表'AirConditioner'中标识列的显式值。

我看到我需要添加以下行: SET IDENTITY_INSERT [dbo]。[AirConditioner] ON,最后OFF 我补充说,它仍然抛出异常......

我的商店程序附在图片enter image description here

4 个答案:

答案 0 :(得分:4)

SQL Server将负责为您的标识列分配值。您应该从insert语句中删除@ID并删除IDENTITY_INSERT语句。

答案 1 :(得分:0)

  

只能在列中指定   使用list并且IDENTITY_INSERT是   ON。

您忘记了第一个条件:列列表。列列表是表名和values之间的(通常)可选元素。您应该将其指定为:

INSERT INTO AirConditioner (ID, CategoricNumber, ...)
VALUES(@ID, @CategoricNumber, ...)

答案 2 :(得分:0)

请勿使用set identity insert。如果你有一个身份,你应该让SQL服务器决定放在那里的值。

ALTER PROCEDURE [dbo].[AddAirConditioner] @CategoricNumber int, @Name nvarchar(50),
@PicName nvarchar(100), @ShortDetails nvarchar(200), @Details nvarchar(2000), 
@Price int, @ImagePath nvarchar(500), @AirConditionerType nvarchar(50), @COP float, 
@BTU float, @ProdType nvarchar(20), @ProdIndex int 
AS   

INSERT INTO AirConditioner VALUES( @CategoricNumber, @Name, @PicName, 
@ShortDetails, @Details, @Price, @ImagePath, @AirConditionerType, @COP,
@BTU, @ProdType, @ProdIndex) 

如果需要返回ID以便在子表中使用,请使用scope_identity或output子句。在线查看这些内容以了解如何使用。

答案 3 :(得分:-1)

尝试放置

SET IDENTITY_INSERT [dbo].[AirConditioner] ON
GO

在改变程序之前