Tsql 手动备份SQLEXPRESS名称中的日期和时间。

Tsql 手动备份SQLEXPRESS名称中的日期和时间。,tsql,sqlcmd,Tsql,Sqlcmd,sql.sql DECLARE@pathName-NVARCHAR(512) SET@pathName='l:\Backup\db\u Backup'+Convert(varchar(17),GETDATE(),120)+'.bak' 备份数据库mydatabase TO DISK=@pathName WITH NOFORMAT,NOINIT,NAME=N'db_BACKUP',SKIP,NOREWIND,NOUNLOAD,STATS=10 备份.bat sqlcmd -S mycomp\SQL

sql.sql

DECLARE@pathName-NVARCHAR(512)
SET@pathName='l:\Backup\db\u Backup'+Convert(varchar(17),GETDATE(),120)+'.bak'
备份数据库mydatabase TO DISK=@pathName WITH NOFORMAT,NOINIT,NAME=N'db_BACKUP',SKIP,NOREWIND,NOUNLOAD,STATS=10

备份.bat

sqlcmd -S mycomp\SQLEXPRESS -U sa -P password -i sql.sql
输出备份格式如下所示:l:\backup\db\u backup\u 2014-05-22 17??
为什么不显示分、秒和分机“.bak”。我需要以格式显示日期和时间:YYYY-MM-DD HH-MM-SS。谢谢你的回答。

你没有时间了,因为这句话:

Convert(varchar(17), GETDATE(), 120)
在17个字符处停止字符串,该长度不足以包含所需的所有数据。试一试

Convert(varchar(19), GETDATE(), 120)
相反

至于文件名被截断的事实,这可能是因为它包含冒号,这在文件路径和名称中是非法的。试试这个

Replace(Convert(varchar(19), GETDATE(), 120), ':', '_')
总之,您的SQL需要:

DECLARE @pathName NVARCHAR(512)

SET @pathName = 'l:\Backup\db_backup_' + REPLACE(CONVERT(VARCHAR(19), GETDATE(), 120), ':', '_') + '.bak'

BACKUP DATABASE mydatabase TO DISK = @pathName
WITH NOFORMAT
    ,NOINIT
    ,NAME = N'db_backup'
    ,SKIP
    ,NOREWIND
    ,NOUNLOAD
    ,STATS = 10

因为varchar(17)的长度不足以容纳秒数,所以您正在截断秒数。此外,文件名中不能有冒号

试试这个

DECLARE @pathName NVARCHAR(512) 
SET @pathName = 'l:\Backup\db_backup_' + 
    REPLACE(CONVERT(varchar(19), GETDATE(), 120), ':','-') + '.bak' 
BACKUP DATABASE mydatabase TO DISK = @pathName 
WITH NOFORMAT, NOINIT, NAME = N'db_backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

您的转换为short,您需要varchar(19)而不是varchar(17),并且您需要将:替换为-

   DECLARE @pathName NVARCHAR(512) 
  SET @pathName = 'l:\Backup\db_backup_' + SELECT REPLACE(CONVERT(varchar(19), GETDATE(), 120), ':','-') + '.bak' 
  BACKUP DATABASE mydatabase TO  DISK = @pathName WITH NOFORMAT, NOINIT,  NAME = N'db_backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

我非常感谢你,没问题。如果这是一个有用的答案,请考虑接受和接受。