我有这个触发器,我正在尝试调试。我需要知道它试图插入的值。下面的 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;
最佳答案
@cadrell0 是正确的,您不应在插入语句中为变量设置某些内容。您也不应该在触发器中为标量变量设置任何内容。插入和删除的表可能有多于一行,因此可能有多于一个值。你需要从的角度考虑套对于触发器。
但是,这是我开发触发器并查看正在发生的事情的过程。
首先,我找出触发器之外的代码(在开发中,这可能意味着在您为重大更改制定工作时删除现有触发器)。
因此,我将插入和/或删除的表设置并填充为脚本中的临时表(Iscript 出实际表并更改名称以使其更容易)。我确保用多条记录(非常重要!)和满足我的测试用例的数据填充它们。
然后我编写代码(减去创建触发器部分)并在我将使用插入或删除的任何地方使用 #inserted 和/或 #deleted 临时表。现在我可以一次运行一个零件,并在需要时查看我的结果。我还可以将所有内容放入一个事务中并在最后回滚它,以便我可以继续重复使用相同的测试数据,直到我做对为止。
一旦我知道我的代码完成了我想要它做的事情,我就会删除事务、临时表代码和任何测试代码,并在全局范围内用空替换 # 符号(因此仅触发器表现在称为插入和/或删除) .然后我添加创建触发器代码并创建触发器。
关于sql-server - 如何调试插入/更新触发器以查看插入/更新的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098917/