我正在通過表運行“僅還原驗證”回圈,但如果成功,我需要它來更新該表中的欄位。這是我的代碼:
DECLARE @Path NVARCHAR(max)
DECLARE @DatabaseName NVARCHAR(100)
DECLARE @NSql NVARCHAR(1000)
DECLARE @Update NVARCHAR(200)
DECLARE @DB_Text NVARCHAR(50)= 'Backup has been confirmed for'
BEGIN
DECLARE
@DatabaseId INT = 1,
@NumberOfDBs INT
SELECT @NumberOfDBs= COUNT(*) FROM dbo.RestoreVerifyDatabases
WHILE @DatabaseId<= @NumberOfDBs
BEGIN
SELECT * FROM dbo.RestoreVerifyDatabases WHERE DatabaseId= @DatabaseId
SET @DatabaseId = @DatabaseId 1
END
SET @Path = (SELECT LastBackupFileName FROM RestoreVerifyDatabases WHERE DatabaseId =
@DatabaseId)
SET @DatabaseName = (SELECT DatabaseName FROM RestoreVerifyDatabases WHERE DatabaseId =
@DatabaseId)
SET @NSql = N'SELECT LastBackupFileName
FROM RestoreVerifyDatabases
WHERE DatabaseName = @DatabaseName
AND DatabaseId = @DatabaseId'
EXEC sp_executesql @NSql
IF @DatabaseId IS NULL
BEGIN
RAISERROR(N'Verify failed. Backup information for database N''@DatabaseName'' not
found.', 16, 1)
END
RESTORE VERIFYONLY
FROM @Path
WITH FILE = @DatabaseId, checksum
SET @Update= N'UPDATE RestoreVerifyDatabases
SET Confirmed = @DB_Text @DatabaseName
WHERE DatabaseID = @DatabaseId'
EXEC sp_executesql @Update
END
僅還原驗證的回圈和呼叫作業正常,但沒有呼叫更新。請幫忙。
uj5u.com熱心網友回復:
據我所知,您的代碼有一些問題。正如我的評論所指出的,您在 上運行一個回圈@databaseID,然后在回圈內立即將 id 增加 1。
這意味著您@databaseId將簡單地增加,直到達到 id 的最大值,然后退出回圈。然后,您的其余代碼將執行一次(僅針對該 ID)。
這發生在您的代碼中:
SELECT @NumberOfDBs= COUNT(*) FROM dbo.RestoreVerifyDatabases
WHILE @DatabaseId<= @NumberOfDBs
BEGIN
SELECT * FROM dbo.RestoreVerifyDatabases WHERE DatabaseId= @DatabaseId
SET @DatabaseId = @DatabaseId 1
END
-- Bunch of other code
因此,@databaseID 在該回圈中從 1 變為 50(只是一個亂數),然后以 50 的值存在。任何底層代碼都無法看到除 50 之外的任何值。
要解決此問題,代碼應如下所示:
SELECT @NumberOfDBs= COUNT(*) FROM dbo.RestoreVerifyDatabases
WHILE @DatabaseId<= @NumberOfDBs
BEGIN
SELECT * FROM dbo.RestoreVerifyDatabases WHERE DatabaseId= @DatabaseId
-- Bunch of other code
SET @DatabaseId = @DatabaseId 1
END
這將確保“一堆其他代碼”處理@databaseid = 1,然后處理@databaseid = 2,等等,直到@databaseid = 50。
您還可以洗掉此行:
SELECT * FROM dbo.RestoreVerifyDatabases WHERE DatabaseId= @DatabaseId
我懷疑你有它用于除錯目的,但它并沒有真正做任何事情。
這些行可以簡化:
SET @Path = (SELECT LastBackupFileName FROM RestoreVerifyDatabases WHERE DatabaseId =
@DatabaseId)
SET @DatabaseName = (SELECT DatabaseName FROM RestoreVerifyDatabases WHERE DatabaseId =
@DatabaseId)
作為:
SELECT @Path = LastBackupFileName, @DatabaseName = DatabaseName FROM RestoreVerifyDatabases WHERE DatabaseId = @DatabaseId
您還有一個 RAISEERROR。我懷疑這是因為你做了一個計數(*),而不是選擇實際存在的@databaseids。這適用于資料庫永遠不會被洗掉的理想場景。但是,在現實世界中,您會從 databaseid 1 變為 5,因為 2、3 和 4 已被洗掉。您的計數仍將是 50 個資料庫,但由于這些差距,您會錯過所有 ID 高于計數的資料庫。您將嘗試處理不再存在的資料庫標識,并錯過 id > 50 的資料庫標識。
您可以改為撰寫回圈來執行以下操作:
SELECT @DatabaseID = MIN(DatabaseID) FROM dbo.RestoreVerifyDatabases
WHILE @datbaseID IS NOT NULL
BEGIN
-- Do stuff
SELECT @DatabaseID = MIN(DatabaseID) FROM dbo.RestoreVerifyDatabases WHERE databaseID > @databaseID
END
最后,您的動態代碼不起作用。您正在添加文字文本而不是引數的值。如果我在最后列印 @Update 的值,它會顯示為:
UPDATE RestoreVerifyDatabases
SET Confirmed = @DB_Text @DatabaseName
WHERE DatabaseID = @DatabaseId
你的代碼應該是這樣的:
SET @Update= CONCAT('UPDATE RestoreVerifyDatabases SET Confirmed = ''', @DB_Text, ' ', @DatabaseName, ''' WHERE DatabaseID = ', @DatabaseId)
哪個輸出:
UPDATE RestoreVerifyDatabases SET Confirmed = 'Backup has been confirmed for Last' WHERE DatabaseID = 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489859.html
上一篇:觸發與程序來更新計算列
