我有以下触发器。在插入新行时,存储过程无法获取变量@ItemID
的参数值。我试图将新插入的Row的ItemID列的值传递给存储过程CalculateCurrentStock
ALTER TRIGGER UpdateCurrentStock
ON StockIn
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
EXEC CalculateCurrentStock (SELECT ItemID From INSERTED)
END
错误文本为
过程或函数'CalculateCurrentStock'需要参数 '@ItemID',未提供。声明已经终止。
感谢您的帮助。
编辑:回答
我根据Derek Kromm和KM的建议改变了触发器
ALTER TRIGGER UpdateCurrentStock
ON StockIn
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CSV varchar(max)
SELECT @CSV=ISNULL(@CSV+',','')+ItemID From INSERTED
EXEC CalculateCurrentStock @CSV
END
感谢您的帮助:)
答案 0 :(得分:3)
编辑:正如Martin指出的那样,如果您使用的是SQL Server 2008,则可以传递一个表值参数。如果您使用的是2005或之前的版本,则无法执行此操作。 KM建议在这种情况下使用逗号分隔值,我个人不同意。
实际上,您应该将存储过程逻辑直接复制到触发器中,并完全避免整个混乱。
答案 1 :(得分:2)
在使用光标之前,我个人会睁大眼睛,特别是当你可以在一个程序调用中同时传递一组值(表值参数或CSV)时。
如果您运行的是SQL Server 2008,则可以使用Table-Valued Parameters创建过程,并且应该能够传入INSERTED
表。
如果您使用的是SQL Server 2005,则可以在varchar(max)变量中创建逗号分隔值(csv)值列表,并将其传递给您的过程。
编辑,以下是传递CSV的方式
ALTER TRIGGER UpdateCurrentStock
ON StockIn
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CSV varchar(max)
SELECT @CSV=ISNULL(@CSV+',','')+ItemID From INSERTED
EXEC CalculateCurrentStock @CSV
END
现在,你需要拆分@CSV值,所以请看这里:Pass a list-structure as an argument to a stored procedure