一行中的各个列同时更新

Simultaneous update of various columns in one row

在更新我的 table 时,只有从 path_name 检索到的第一个值被插入到每个单元格中,这不是预期的。

当前结果:

path_bak           file_exists  file_is_a_dir   parent_dir_exists
folder/file_1.BAK  1            0               1
folder/file_1.BAK  0            0               1

预期结果,一旦 FETCH 检索到 path 的新值,它应该被插入到 path_bak.

path_bak           file_exists  file_is_a_dir   parent_dir_exists
folder/file_1.BAK  1            0               1
folder/file_2.BAK  0            0               1

当前导致问题的代码片段:

DECLARE @diff_path NVARCHAR(MAX)
DECLARE @sql NVARCHAR(MAX)
DECLARE @tableVar TABLE (path_bak NVARCHAR(MAX), file_exists INT, file_is_a_dir INT, parent_dir_exists INT)
 
DECLARE path_name CURSOR FOR
       SELECT msdb.dbo.backupmediafamily.physical_device_name
                     --MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date 
       FROM msdb.dbo.backupmediafamily  
       INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  
                                  
       WHERE msdb..backupset.type = 'I' 
       AND msdb.dbo.backupset.database_name = 'db_name'
                  
       GROUP BY msdb.dbo.backupmediafamily.physical_device_name
       ORDER BY MAX(msdb.dbo.backupset.backup_finish_date) DESC;
 
OPEN path_name;  
  
--Perform the first fetch.  
FETCH NEXT FROM path_name INTO @diff_path; 
 
--Check @@FETCH_STATUS to see if there are any more rows to fetch.  
WHILE @@FETCH_STATUS = 0  
BEGIN  
   --This is executed as long as the previous fetch succeeds.  
   SET @sql = 'EXEC master.dbo.xp_fileexist ''' + @diff_path + ''''
   INSERT INTO @tableVar(file_exists, file_is_a_dir, parent_dir_exists) EXEC sp_executesql @sql 
   UPDATE @tableVar SET path_bak = @diff_path
 
   FETCH NEXT FROM path_name INTO @diff_path;  
END  
 
 
--test results
SELECT * FROM @tableVar
 
CLOSE path_name;  
DEALLOCATE path_name;  
GO

您的 update 正在更新所有行。您需要一个 WHERE 子句来标识最近的行。 . .但这对于您当前的结构来说有点棘手。

我的建议是将数据加载到临时 table 然后再加载到最终 table:

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'EXEC master.dbo.xp_fileexist ''' + @diff_path + '''';

    DECLARE @temp TABLE (file_exists int, file_is_a_dir int, parent_dir_exists int);

    DELETE FROM @temp;

    INSERT INTO @temp (file_exists, file_is_a_dir, parent_dir_exists)
        EXEC sp_executesql @sql;

    INSERT INTO @tableVar (path_bak, file_exists, file_is_a_dir, parent_dir_exists)
        SELECT @diff_path, file_exists, file_is_a_dir, parent_dir_exists
        FROM @temp;

    FETCH NEXT FROM path_name INTO @diff_path
END;

Here 是一个带有逻辑模型的 db<>fiddle。