【问题标题】:sqlcmd does not create parameters on a backup file name when executed through Powershell or Command line通过 Powershell 或命令行执行时,sqlcmd 不会在备份文件名上创建参数
【发布时间】:2018-12-25 04:35:26
【问题描述】:

我想在 SQL Server 2017 Express 实例上创建一些数据库的自动备份,所以我使用了这个:How to schedule and automate backups of SQL Server databases in SQL Server Express

我以为我只需通过任务计划程序通过 PowerShell 脚本运行生成的 sp_BackupDatabases,因为备份还有其他自动化操作。

我创建了一个 PowerShell 脚本来执行sp_BackupDatabases,如下所示:

sqlcmd -S .\MYSQLEXPRESS2017INSTANCE -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\MAYBACKUPLOCATION\', @databaseName='MYDB', @backupType='F'"

这确实会在指定位置创建备份文件,但不会按照存储过程的定义附加日期和时间或.BAK 扩展名。我只是得到一个没有扩展名为“MYDB_FULL”的文件。该文件除此之外都很好,即我可以将其重命名为“MYDB_FULL_MYDATE.BAK”。未报告任何错误。

如果我使用调试器通过 SQL Server Management Studio (SMS) 执行此操作,我可以看到一切正常,并且创建了完整的文件名以及 .BAK 扩展名。

我试验并创建了一个与存储过程完全一样的 SQL 脚本。同样,通过 SSMS 执行一切正常,但通过 sqlcmd(在 PowerShell 中或从命令提示符处)调用时就不行了。

如果我重命名文件并通过 SSMS 检查它,它已正确命名(使用 @BackupName 变量),因此我知道它正在生成时间和日期变量并根据脚本附加它们。

如果有任何区别,SQL Server 2017 Express 实例与 Windows Server 2012R2(不是 DC)上的 SQL Server 2014 Express 实例一起运行。

重命名文件是一件小事,但我错过了什么?!

【问题讨论】:

  • sp_BackupDatabases 的 sql 是什么?如果您说它在那里进行重命名,那就是我们需要查看的 SQL。
  • 谢谢 Larnu - Microsoft 链接有完整的代码,所以为了节省空间我把它省略了,事后看来是错误的......!

标签: sql-server powershell sqlcmd


【解决方案1】:

经过数小时的摸索,我刚刚找到了答案 - 这是一个经典的编程错误,我错过了绝对明显的情况,因为它只是错过了时间并且 .BAK 附加到文件名。它可能是任何东西。

我重用了 Microsoft 的代码来创建 SP sp_BackupDatabases。这是变量名中空格的简单情况。我已经重新发布了我对代码的更正要点,以防其他人看到这个问题。这两个变量是

@backupLocation nvarchar(200)
...
DECLARE @BackupFile varchar(100) 

脚本中有一个点是创建文件名的:

SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'

所以问题是,在我的情况下,备份位置暂时位于路径名很长的地方。当 @backupFile,大小为 var(100) 设置为可能占用最多 200 个字符的位置时,它不能很好地进入顶端,只是被截断而没有错误......

对于那些感兴趣的人,完整的代码在Gist 上以节省空间。

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2011-09-19
    • 2015-04-08
    • 2019-03-03
    • 2019-09-27
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多