我已经编写了一些代码以确保订单上的商品都已编号(“位置编号”或“商品编号”仅在最近才引入,我们不想更改所有相关代码 - 因为它只是“美学”,没有任何功能影响。)
所以,我的想法是去检查一个包含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
答案 0 :(得分:0)
Aaaargh - 刚刚发现问题:当WHERE为NULL的结果时,3d行(从最后,SELECT语句)不会分配变量。所以在该语句之前“设置@idp = null”已经解决了问题! 不确定为什么我在直接执行和触发这些语句之间遇到问题,似乎我选择了错误的测试用例:(