使用sqlcmd赋值变量:服务器备份作业脚本变量调用问询
在sqlcmd中创建并复用变量的方法
当然可以在sqlcmd脚本/命令里创建变量并后续调用,分两种常见场景来帮你实现需求:
1. 在单个T-SQL批处理中使用T-SQL变量
你当前的命令已经通过DECLARE定义了T-SQL变量@CurrentDate,要复用这个变量生成字符串(比如备份路径),只需要在同一个批处理里直接引用它即可。比如你可以扩展命令,生成备份文件名并执行备份:
sqlcmd -E -d master -Q "DECLARE @CurrentDate VARCHAR(10); SET @CurrentDate = FORMAT(GETDATE(), 'ddMMyyyy', 'en-us'); DECLARE @BackupFilePath NVARCHAR(255); SET @BackupFilePath = N'C:\Backups\MyDB_Backup_' + @CurrentDate + N'.bak'; -- 打印生成的路径 SELECT @BackupFilePath AS GeneratedBackupPath; -- 执行备份操作(替换成你的数据库名) BACKUP DATABASE MyDatabase TO DISK = @BackupFilePath WITH INIT, COMPRESSION;" -b
这里的关键是:所有使用@CurrentDate的操作都要放在同一个DECLARE语句所在的批处理里(不要用GO分隔,否则变量会失效)。
2. 使用sqlcmd脚本变量(跨批处理/外部脚本复用)
如果你的操作需要跨多个T-SQL批处理,或者要在外部.sql脚本里复用这个日期变量,就需要用到sqlcmd自带的:setvar脚本变量。步骤如下:
第一步:生成包含变量定义的临时脚本
先运行一个sqlcmd命令,把当前日期输出为sqlcmd的变量定义语句:
sqlcmd -E -d master -b -Q "SET NOCOUNT ON; DECLARE @CurrentDate VARCHAR(10); SET @CurrentDate = FORMAT(GETDATE(), 'ddMMyyyy', 'en-us'); PRINT ':setvar CurrentDate ' + @CurrentDate;" -o temp_setvar.sql
这会生成一个temp_setvar.sql文件,内容类似: :setvar CurrentDate 15102024
第二步:在实际脚本中引用这个变量
创建你的备份脚本(比如BackupJob.sql),里面用$(CurrentDate)引用sqlcmd变量:
-- BackupJob.sql USE master; GO BACKUP DATABASE MyDatabase TO DISK = N'C:\Backups\MyDB_Backup_$(CurrentDate).bak' WITH INIT, COMPRESSION; GO -- 其他需要用到日期变量的操作 SELECT N'Backup completed for date: $(CurrentDate)' AS BackupStatus;
第三步:合并执行脚本
最后用sqlcmd同时加载变量定义脚本和实际备份脚本:
sqlcmd -E -d master -i temp_setvar.sql -i BackupJob.sql -b
这样就能在多个批处理里复用这个日期变量了。
内容的提问来源于stack exchange,提问作者a_m_2016
相关产品推荐
相关产品推荐

