使用定义为股票低于最低水平的触发器获取错误,将数据插入到另一个表中



我想编写一个触发器来检查当前库存,如果库存低于minimumrequired,尤其是在更新时,将数据插入另一个表中。

产品表:

CREATE TABLE product 
(
[ProductId] INT NOT NULL IDENTITY PRIMARY KEY,
[ProductName] VARCHAR(255) NOT NULL,
[PartNumber] VARCHAR(255) NOT NULL,
[ProductLabel] VARCHAR(255) NOT NULL,
[StartingInventory] INT NOT NULL,
[InventoryReceived] INT NOT NULL,
[InventoryShipped] INT NOT NULL,
[InventoryOnHand] INT NOT NULL,
[MinimumRequired] INT NOT NULL,
) ;

警报表:

CREATE TABLE alert
(
[AlertId] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[ProductId] INT NOT NULL, 
[ProductName] VARCHAR(255) NOT NULL,
[AlertType] VARCHAR(50) NULL,
[AlertDate] DATETIME DEFAULT GETDATE(),
[AlertDescription] VARCHAR(255) NULL
);

触发:

DROP TRIGGER IF EXISTS [StockAlert]
GO
CREATE TRIGGER StockAlert
ON product
AFTER UPDATE
AS
BEGIN
INSERT INTO alert 
SELECT 
[ProductID], [ProductName], 'Low Stock', NULL,
'There is only ' + [InventoryOnHand] + [ProductName] + ' left' 
FROM 
inserted
WHERE 
[InventoryOnHand] <= [MinimumRequired]
END

当我尝试使用代码更新值时,出现如下错误。

尝试:

UPDATE product 
SET InventoryOnHand = 9 
WHERE ProductId = 10

错误:

将 varchar 值"只有"转换为数据类型 int 时转换失败

在触发器中,您应该:

  • 显式列出要插入的目标表的列(对于任何 SQLINSERT语句,这是普遍接受的最佳实践(
  • 避免传递AlertDate列的NULL- 通过从INSERT语句中省略该列,您将获得DEFAULT约束 - 如果您传入NULL,您将获得NULL存储(这通常不是您想要的(
  • 在连接消息字符串时转换数据类型(或使用CONCAT,如果您的 SQL Server 版本支持(。

试试这个语句:

INSERT INTO alert (ProductId, ProductName, AlertType, AlertDescription)
SELECT 
[ProductID], [ProductName], 'Low Stock', 
CONCAT('There is only ', [InventoryOnHand], ' ', [ProductName], ' left')
FROM 
inserted
WHERE 
[InventoryOnHand] <= [MinimumRequired]

最新更新