SQL Server中的sp_添加_作业步骤

SQL Server中的sp_添加_作业步骤,sql,sql-server,Sql,Sql Server,我用SQL编写了以下内容: EXEC sp_add_jobstep @job_name = N'Every 5 minutes log backup ', @step_name = N'set T-sql command', @subsystem = N'TSQL', @command=N'DECLARE @fileName NVARCHAR(256) BACKUP LOG MM TO DISK =''F:\BackUp\Log\M-''' +dbo.UDF_Gr

我用SQL编写了以下内容:

EXEC sp_add_jobstep
    @job_name = N'Every 5 minutes log backup ',
    @step_name = N'set T-sql command',
    @subsystem = N'TSQL',
    @command=N'DECLARE @fileName NVARCHAR(256) BACKUP LOG MM TO DISK =''F:\BackUp\Log\M-''' +dbo.UDF_Gregorian_To_Persian_WithDash(cast(GETDATE() as date))+'''-'''+ REPLACE(cast(isnull(convert(char(5), GETDATE(), 108),'''''')  as nvarchar),''':''','''''') + '''.TRN''',
    @retry_attempts = 1,
    @retry_interval = 1 ;
GO
但是SQL说

“不正确的语法接近+”


请帮帮我

那些使徒有点乱。你想要的是:

DISK ='F:\BackUp\Log\M-x-y.TRN'
但通过查看当前字符串,它更可能是:

DISK ='F:\BackUp\Log\M-'x'-'y'.'TRN'
因此,我希望这会更好:

@command = N'DECLARE @fileName NVARCHAR(256) BACKUP LOG MM TO DISK = ''F:\BackUp\Log\M-' + cast(dbo.UDF_Gregorian_To_Persian_WithDash(cast(GETDATE() as date)) as nvarchar) + '-' + REPLACE(cast(isnull(convert(char(5), GETDATE(), 108),'''''')  as nvarchar),''':''','''''') + '.TRN'''
一个技巧是打印这一行,这样您就可以准确地看到输出结果。在我上面的示例中,输出类似于:

..DISK ='F:\BackUp\Log\M-2015-04-27-08:31.TRN'
编辑:

不确定带破折号的UDF_Gregorian_To_Persian_返回什么,但除非它是
nvarchar
,否则您也需要
CAST()
(使用CAST更新了我上面的示例)。

您可以将变量传递到或文本值,但不允许使用的是表达式

因此,首先将字符串连接作为单独的步骤:

declare @cmd nvarchar(max)
set @cmd = 'DECLARE @fileName NVARCHAR(256) BACKUP ... ' + dbo.UDF_Gregorian_To_Persian_WithDash(...) + ' ... '
EXEC sp_add_jobstep
    @job_name = N'Every 5 minutes log backup ',
    @step_name = N'set T-sql command',
    @subsystem = N'TSQL',
    @command=@cmd,
    @retry_attempts = 1,
    @retry_interval = 1 ;

如果我通过@cmd,则日期和时间不是最新的,因为我需要有命名日志备份的确切日期和时间file@user2315036您可以在这里看到一个示例:(运行SQL)。查询仍将返回预期结果。您是否有任何新的错误消息?正如Damien提到的,exec将不接受表达式(doh)。不知道如何将其放入作业中,然后在其中进行分析。