一行中的各个列同时更新
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。
在更新我的 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。