Проблема выполнения триггера SQL - PullRequest
2 голосов
/ 24 августа 2011

У меня есть следующий триггер. При вставке новой строки хранимая процедура не может получить значение параметра переменной @ItemID. Я пытаюсь передать значение столбца ItemID вновь вставленной строки в хранимую процедуру CalculateCurrentStock

ALTER TRIGGER UpdateCurrentStock
   ON StockIn
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    EXEC CalculateCurrentStock (SELECT ItemID From INSERTED)
END

Текст ошибки гласит

Процедура или функция CalculateCurrentStock ожидает параметр '@ItemID', который не был предоставлен. Заявление было прекращено.

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Ответ

Я изменил курок согласно предложению Дерека Кромма и К.М.

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 ]

3 голосов
/ 24 августа 2011

Редактировать: Как указал Мартин, вы можете передать табличный параметр, если вы используете SQL Server 2008. Если вы используете 2005 или более раннюю версию, вы не можете этого сделать. В этом случае KM предлагает использовать значение, разделенное запятыми, с чем я лично не согласен.

В действительности вам, вероятно, следует скопировать логику хранимой процедуры непосредственно в триггер и избежать всего беспорядка в целом.

2 голосов
/ 24 августа 2011

Я бы лично высунул глаза перед использованием курсора, особенно когда вы можете передать набор значений (параметр табличных значений или CSV) одновременно за один вызов процедуры.

если вы работаете с SQL Server 2008, вы можете создать свою процедуру, используя Табличные параметры , и сможете передавать в таблицу INSERTED.

Есливы используете SQL Server 2005, вы можете создать список значений, разделенных запятыми (csv), в переменной varchar (max) и передать это в вашу процедуру.

EDIT , воткак передать 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, поэтому посмотрите здесь: Передайте структуру списка в качестве аргумента хранимой процедуре

...