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临时表.现在我可以一次运行一个部件,如果需要的话,可以看到我的结果.我还可以将所有内容放入事务中并在最后回滚,以便我可以继续重复使用相同的测试数据,直到我做对了.
一旦我知道我的代码完成了我想要它做的事情,我就删除了事务,临时表代码和任何测试代码,并且全局替换了#符号(所以现在调用仅触发表被插入和/或删除) .然后我添加创建触发器代码并创建触发器.