以下 SQL 陳述句可以正常作業:
DECLARE @database VARCHAR(30) = 'DEMO';
BACKUP LOG @database
TO DISK = N'C:\zbackups\DEMO.trn'
WITH NOFORMAT, NOINIT,
NAME = N'MyDatabase Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
DBCC SHRINKFILE ('DEMO_log', 500);
然而,這不會:
DECLARE @database VARCHAR(30) = 'DEMO';
BACKUP LOG @database
TO DISK = 'C:\zbackups\' @database '.trn'
WITH NOFORMAT, NOINIT,
NAME = 'MyDatabase Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
DBCC SHRINKFILE (@database '_log', 500);
當我嘗試連接時,TO DISK指令和DBCC SHRINKFILE引數都會引發錯誤。
如何在這些位置使用變數?還想將一些日期時間引數附加到檔案路徑但尚未開始研究。
uj5u.com熱心網友回復:
問題只是你不能在那里傳遞運算式。代替:
TO DISK = 'C:\zbackups\' @database '.trn'
你需要:
DECLARE @fullpath nvarchar(1024);
SET @fullpath = 'C:\zbackups\' @database '.trn';
...
TO DISK = @fullpath
...
您還可以以類似的方式(而不是硬編碼NAME = 'MyDatabase Log Backup')引數化備份名稱和日志檔案名稱。但是為了讓收縮操作在正確的背景關系中運行(如果你真的、真的、真的、真的需要它),并且你可以依賴以相同方式配置的每個資料庫,你將擁有在某處硬編碼資料庫名稱(例如在USE陳述句中),或使用動態 SQL 將背景關系設定為正確的資料庫,例如
DECLARE @database sysname = N'DEMO';
DECLARE @fullpath nvarchar(1024) = N'C:\zbackups\' @database '.trn',
@backup_name nvarchar(500) = @database N' log backup',
@log_name nvarchar(500) = @database _ N'_log';
DECLARE @sql nvarchar(max) = N'BACKUP LOG @db
TO DISK = @fullpath
WITH NOFORMAT, NOINIT, NAME = @backup_name,
SKIP, NOREWIND, NOUNLOAD, STATS = 10;
DBCC SHRINKFILE(@log, 500);';
DECLARE @context nvarchar(1024) = QUOTENAME(@database)
N'.sys.sp_executesql';
EXECUTE @context @sql, -- run @sql but in the context of @database
N'@db sysname, @log nvarchar(500),
@fullpath nvarchar(1024), @backup_name nvarchar(500)',
@database, @log_name, @fullpath, @backup_name;
uj5u.com熱心網友回復:
根據https://learn.microsoft.com/en-us/sql/t-sql/statements/backup-transact-sql?view=sql-server-ver16可以使用變數。如果允許,我認為會列出一個運算式。DBCC SHRINKFILE 也是如此。嘗試
DECLARE @database VARCHAR(30) = 'DEMO';
DECLARE @target VARCHAR(260) = 'C:\zbackups\' @database '.trn';
DECLARE @logical_name VARCHAR(128) = @database '_log';
BACKUP LOG @database
TO DISK = @target
WITH NOFORMAT, NOINIT,
NAME = 'MyDatabase Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
DBCC SHRINKFILE (@logical_name, 500);
如果邏輯檔案名并不總是遵循 dbname_log 模式,也許查找檔案 id 并使用它而不是 SHRINKFILE 中的邏輯名。注意連接上的資料庫范圍。
DECLARE @file_id int
SELECT @file_id = file_id
FROM sys.database_files
WHERE physical_name = @target
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/512469.html
