数据调整代码在直接执行时运行良好 - 但在触发器中使用时永远不会停止

时间:2010-02-27 19:08:17

标签: tsql triggers

我已经编写了一些代码以确保订单上的商品都已编号(“位置编号”或“商品编号”仅在最近才引入,我们不想更改所有相关代码 - 因为它只是“美学”,没有任何功能影响。

所以,我的想法是去检查一个包含NULL或0的itemno的记录 - 然后计算一个并分配它。在查询窗口中执行此代码时,它工作正常。将它放入AFTER INSERT触发器时,它会永远循环。

那么这里有什么问题?

/****** Objekt:  Trigger [SetzePosNr]    Skriptdatum: 02/28/2010 20:06:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [SetzePosNr]
ON [dbo].[bestellpos]
   AFTER INSERT 
  AS
BEGIN
   DECLARE @idb int
   DECLARE @idp int
   DECLARE @pnr int

   SELECT @idp=id,@idb=id_bestellungen FROM bestellpos WHERE posnr IS NULL OR posnr=0

   WHILE @idp IS NOT NULL
   BEGIN   
      SELECT @pnr = 1+max(posnr) FROM bestellpos WHERE id_bestellungen = @idb
print( 'idp=' + str(@idp) + ', idb=' + str(@idb) + ', posnr=' + str(@pnr))
      UPDATE bestellpos SET posnr=@pnr WHERE id=@idp
      SELECT @idp=id,@idb=id_bestellungen FROM bestellpos WHERE posnr IS NULL OR posnr=0
   END
 END

1 个答案:

答案 0 :(得分:0)

Aaaargh - 刚刚发现问题:当WHERE为NULL的结果时,3d行(从最后,SELECT语句)不会分配变量。所以在该语句之前“设置@idp = null”已经解决了问题! 不确定为什么我在直接执行和触发这些语句之间遇到问题,似乎我选择了错误的测试用例:(