2012-02-01 167 views
3

我有这个触发器,我试图调试。我需要知道它试图插入的值。下面的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; 
+0

你能不选择它出表[BPRIL DATA ENTRY]的?为什么@Item变量? ins.itemnumber会出现在表格中[BPRIL DATA ENTRY] – William 2012-02-01 16:01:48

+0

@Item是我想看到的变量,所以这就是为什么我创建了该变量...用于调试目的。 – Bruno 2012-02-01 16:07:09

回答

1

我创建了一个表:

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

然后我跑了触发插入到debugTrace的,而不是[BPRIL DATA ENTRY]

1

您不能设置变量并同时插入表中。您需要在两个单独的查询中完成此操作。

9

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

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

首先,我找出触发器外的代码(在开发时,这可能意味着在您为重大更改进行工作时删除现有触发器)。

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

然后我编写代码(减去创建触发器部分)并使用插入或删除的任何位置的#inserted和/或#deleted临时表。现在,我可以一次运行一部分,并在需要的时候查看我的结果。我还可以将所有内容放入事务中,并在最后回滚,以便我可以重复使用相同的测试数据,直到我找到正确的答案。一旦我知道自己的代码做了我想做的事情,我就删除事务,临时表代码和任何测试代码,并全局替换#符号(因此现在仅调用触发器表被插入, /或删除)。然后我添加创建触发器代码并创建触发器。