我想编写一个触发器来检查当前库存,如果库存低于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 时转换失败
在触发器中,您应该:
-
显式列出要插入的目标表的列(对于任何 SQL
INSERT
语句,这是普遍接受的最佳实践( - 避免传递
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]