我有一个文件系统应用程序,它使用 SQL Server 2008 R2 来跟踪文件。当我删除一个文件时,我想更新路径层次结构中的父级以反映它们的新大小。我使用@fid 作为当前FILE_ID,@size 作为FILE_SIZE,@pid 作为层次结构中父级的FILE_ID。
这是我正在使用的循环:
SELECT @pid=PARENT_ID FROM FILES WHERE FILE_ID=@fid;
WHILE @pid<>0
BEGIN
UPDATE FILES
SET
FILE_SIZE =
-- Avoid potential situation where new file size might incorrectly drop below 0
CASE
WHEN FILE_SIZE-@size>=0 THEN FILE_SIZE-@size
ELSE 0
END
WHERE FILE_ID=@pid;
SET @fid=@pid;
SELECT @pid=PARENT_ID FROM FILES WHERE FILE_ID=@fid;
END
当我运行它时,尺寸不会更新。如果我用 SELECT 替换 UPDATE,它看起来应该可以正常工作。到底是怎么回事? 为什么尺寸没有更新?有一个更好的方法吗?
为了添加一些上下文,这个 snip-it 实际上在另一个循环中运行,因此可以批量删除多个文件。这是此上下文中的代码:
-- Declarations
DECLARE @fid int, @size int, @pid int;
DECLARE c CURSOR FOR
SELECT
FILE_ID, FILE_SIZE
FROM
FILES
OPEN c;
-- Initialize variables
FETCH NEXT FROM c
INTO @fid, @size;
-- Main loop
WHILE @@FETCH_STATUS = 0
BEGIN
-- Statements to delete the file --
-- Loop to update sizes --
SELECT @pid=PARENT_ID FROM FILES WHERE FILE_ID=@fid;
WHILE @pid<>0
BEGIN
UPDATE FILES
SET
FILE_SIZE =
CASE
WHEN FILE_SIZE-@size>=0 THEN FILE_SIZE-@size
ELSE 0
END
WHERE FILE_ID=@pid;
SET @fid=@pid;
SELECT @pid=PARENT_ID FROM FILES WHERE FILE_ID=@fid;
END
FETCH NEXT FROM c
INTO @fid, @size;
END
CLOSE c;
DEALLOCATE c;