首页 > 解决方案 > 为什么我在编写存储过程时收到错误 8101?

问题描述

我有一张名为 Sales 的表

CREATE TABLE Sales
(
    SaleID int IDENTITY(1,1) PRIMARY KEY 
    ,DateOfTransaction dateTime  NOT NULL
    ,QuantitySold int NOT NULL
    ,PaymentMethod nvarchar(40) NOT NULL
    ,EquipmentID int FOREIGN KEY  REFERENCES Equipments(EquipmentID)
    ,CustomerID int  FOREIGN KEY REFERENCES Customers(CustomerID)
    ,SalespersonID int FOREIGN KEY REFERENCES Salespersons(SalespersonID)
);

我正在编写一个存储过程,我想在其中插入数据。到目前为止,这是我的代码:

CREATE PROCEDURE dbo.sproc_PurchaseAdd
    @SaleID INT OUTPUT 
    ,@DateOfTransaction dateTime
    ,@QuantitySold int
    ,@PaymentMethod nvarchar(40)
    ,@EquipmentId int
    ,@CustomerID int
    ,@SalesPersonId int
AS 
BEGIN
    SET IDENTITY_INSERT Sales ON

    INSERT INTO Sales 
    VALUES (@DateOfTransaction, @QuantitySold, @PaymentMethod, @EquipmentId, @CustomerID, @SalesPersonId)

    SET @SaleID = @@IDENTITY 
END
GO

但我收到一个错误:

消息 8101,级别 16,状态 1,过程 sproc_PurchaseAdd,第 13 行 [批处理开始第 75 行]
只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“销售”中的标识列指定显式值。

我有什么特别的东西吗?请帮帮我

标签: sql-servertsql

解决方案


SaleID 是 IDENTITY 所以它会自动递增,

你不需要这个:

SET IDENTITY_INSERT Sales ON

还行吧:

INSERT INTO Sales VALUES (@DateOfTransaction,@QuantitySold,@PaymentMethod,@EquipmentId,@CustomerID,@SalesPersonId)

如果这不起作用,请尝试指定列:

INSERT INTO Sales (DateOfTransaction,QuantitySold,PaymentMethod,EquipmentID,CustomerID,SalespersonID) VALUES (@DateOfTransaction,@QuantitySold,@PaymentMethod,@EquipmentId,@CustomerID,@SalesPersonId)

也尝试使用 SCOPE_IDENTITY() 代替 @@IDENTITY


推荐阅读