如何调试插入/更新触发器以查看插入/更新的值

Bru*_*uno 3 t-sql sql-server triggers

我有这个触发器,我正在尝试调试.我需要知道它试图插入的值.以下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;
Run Code Online (Sandbox Code Playgroud)

HLG*_*GEM 10

@ cadrell0是正确的,你不应该在insert语句中设置一些变量.你也不应该在触发器中为标量变量设置任何东西.插入和删除的表可能有多个行,因此可能有多个值.你需要考虑触发器的集合.

但是,这是我开发触发器并查看正在发生的事情的过程.

首先,我找出触发外部的代码(在开发,这可能意味着丢弃现有的触发器,而你工作的事情了一个重大的变化).

因此,我将插入和/或删除的表设置并填充为脚本中的临时表(Iscript输出实际表并更改名称以使其更容易).我确保用多个记录填充它们(非常重要!)以及满足我的测试用例的数据.

然后我编写代码(减去创建触发器部分)并在我将使用插入或删除的任何地方使用#inserted和/或#deleted临时表.现在我可以一次运行一个部件,如果需要的话,可以看到我的结果.我还可以将所有内容放入事务中并在最后回滚,以便我可以继续重复使用相同的测试数据,直到我做对了.

一旦我知道我的代码完成了我想要它做的事情,我就删除了事务,临时表代码和任何测试代码,并且全局替换了#符号(所以现在调用仅触发表被插入和/或删除) .然后我添加创建触发器代码并创建触发器.