Как отладить триггер вставки / обновления, чтобы увидеть значения, вставленные / обновленные - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть этот триггер, который я пытаюсь отладить. Мне нужно знать значения, которые он пытается вставить. Приведенный ниже параметр Print @Item не работает.

DECLARE @Item VARCHAR(MAX);



  INSERT INTO [BPRIL DATA ENTRY]
              ([COMPANY],
               [CUSTOMER],
               [ITEM #],
               [VENDOR],
               [SEASON],
               [BPRILP0CaseCost],
               [CustomerItem#])
  SELECT DISTINCT oh.company,
         oh.customer,
         @Item = ins.itemnumber,
         ins.vendor,
         oh.season,
         ins.VendorCost,
         oid.[CustomerSKU]
  FROM   [ORDER HEADER] AS oh
         LEFT JOIN [Order Item Detail] AS OID
           ON oh.[ORDER #] = OID.[ORDER #]
         LEFT JOIN [INSERTED] AS ins
           ON ins.[ITEM #] = OID.[ITEM #]
         LEFT JOIN [BPRIL DATA ENTRY] bp
           ON bp.[COMPANY] = oh.company
              AND bp.[CUSTOMER] = oh.customer
              AND bp.[ITEM #] = ins.itemnumber
              AND bp.[VENDOR] = ins.vendor
              AND bp.[SEASON] = oh.season
  WHERE  bp.[COMPANY] IS NULL
         AND bp.[CUSTOMER] IS NULL
         AND bp.[ITEM #] IS NULL
         AND bp.[VENDOR] IS NULL
         AND bp.[SEASON] IS NULL
         AND (OID.[STATUS] = 'C'
         OR OID.[STATUS] = 'I')
         AND ins.[VENDOR] IS NOT NULL
         AND ins.[QUOTE #] IS NOT NULL
         AND ins.[VENDORCOST] IS NOT NULL 

Print @Item;

Ответы [ 3 ]

10 голосов
/ 01 февраля 2012

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

Однако, вот мой процесс разработки триггера и наблюдения за тем, что происходит.

Сначала я выясняю код за пределами триггера (На dev это может означать сброс существующего триггера, пока вы решаете какие-то серьезные изменения).

Итак, я настроил и заполнилвставленные и / или удаленные таблицы как временные таблицы в сценарии (вычеркните фактическую таблицу и измените имя, чтобы сделать это проще).Я обязательно заполняю их несколькими записями (очень важно!) И данными, которые удовлетворят моим тестам.

Затем я пишу код (за исключением части триггера создания) и использую #inserted и / или#deleted временные таблицы в любом месте, которые я бы использовал, вставлены или удалены.Теперь я могу запускать одну часть за раз и видеть результаты по мере необходимости.Я также могу поместить все в транзакцию и откатить ее в конце, чтобы я мог продолжать использовать одни и те же тестовые данные несколько раз, пока не получу правильное определение.

Как только я узнаю, что мой код выполняет то, что я от него хочу, я удаляю транзакции, код временной таблицы и любой тестовый код и глобально заменяю знак # ничем (поэтому теперь называются только триггерные таблицы)вставлен и / или удален).Затем я добавляю код создания триггера и создаю триггер.

2 голосов
/ 01 февраля 2012

Я создал таблицу:

CREATE TABLE DebugTrace
(
   [COMPANY] NVARCHAR(2),
   [CUSTOMER] NVARCHAR(255),
   [ITEM #] NVARCHAR(35),
   [VENDOR] NVARCHAR(50),
   [SEASON] INT,
   [BPRILP0CaseCost] MONEY,
   [CustomerItem#] NVARCHAR(50)
)

Затем я запустил триггер для вставки в DebugTrace вместо [ВВОД ДАННЫХ BPRIL]

1 голос
/ 01 февраля 2012

Невозможно установить переменную и одновременно вставить ее в таблицу.Вам нужно будет сделать это в двух отдельных запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...