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

标签 sql-server tsql 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;

最佳答案

@cadrell0 是正确的,您不应在插入语句中为变量设置某些内容。您也不应该在触发器中为标量变量设置任何内容。插入和删除的表可能有多于一行,因此可能有多于一个值。你需要从的角度考虑套对于触发器。

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

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

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

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

一旦我知道我的代码完成了我想要它做的事情,我就会删除事务、临时表代码和任何测试代码,并在全局范围内用空替换 # 符号(因此仅触发器表现在称为插入和/或删除) .然后我添加创建触发器代码并创建触发器。

关于sql-server - 如何调试插入/更新触发器以查看插入/更新的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098917/

相关文章:

mysql - 根据另一个表自动将数据插入到表中

sql-server - 将包含超过 1024 列的 csv 文件导入到新的 SQL Server 表中

sql - 定期删除 SQL 中的行

SQL Server 列比较,包括 Null/Not Null

sql - 从最后插入的行中选择 id

sql - 如何将记录从互连表复制到不同数据库中的另一个表?

select - 选择后触发

linux - 当我更改 SConstruct 文件时,scons 不会触发重建?

C# 和 SQL LIKE 条件 : '%' works as single-character wildcard

c# - 在 SQL Server 中最后更新记录时保存