我有这个触发器,我正在尝试调试。我需要知道它试图插入的值。以下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 :(得分:10)
@ cadrell0是正确的,你不应该在insert语句中为变量设置一些东西。你也不应该在触发器中为标量变量设置任何东西。插入和删除的表可能有多个行,因此可能有多个值。您需要根据触发器的集进行思考。
但是,这是我开发触发器并查看正在发生的事情的过程。
首先,我找出了触发器之外的代码(On dev这可能意味着在你为重大改变工作时放弃现有的触发器)。
所以我设置并将插入和/或删除的表填充为脚本中的临时表(Iscript输出实际表并更改名称以使其更容易)。我确保用多个记录填充它们(非常重要!)以及满足我的测试用例的数据。
然后我编写代码(减去创建触发器部分)并在我将使用插入或删除的任何地方使用#inserted和/或#deleted临时表。现在我可以一次运行一个部件,如果需要的话,可以看到我的结果。我还可以将所有内容放入事务中并在最后回滚,以便我可以继续重复使用相同的测试数据,直到我做对了。
一旦我知道我的代码完成了我想要它做的事情,我就删除了事务,临时表代码和任何测试代码,并全局替换#符号(所以现在调用仅触发表的插入和/或删除)。然后我添加创建触发器代码并创建触发器。
答案 1 :(得分:2)
我创建了一个表:
CREATE TABLE DebugTrace
(
[COMPANY] NVARCHAR(2),
[CUSTOMER] NVARCHAR(255),
[ITEM #] NVARCHAR(35),
[VENDOR] NVARCHAR(50),
[SEASON] INT,
[BPRILP0CaseCost] MONEY,
[CustomerItem#] NVARCHAR(50)
)
然后我将Trigger插入DebugTrace而不是[BPRIL DATA ENTRY]
答案 2 :(得分:1)
您无法同时设置变量并插入表格。您需要在两个单独的查询中执行此操作。