SQL触发器执行问题

时间:2011-08-24 11:45:36

标签: sql-server sql-server-2005 tsql triggers

我有以下触发器。在插入新行时,存储过程无法获取变量@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

感谢您的帮助:)

2 个答案:

答案 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