【发布时间】:2018-03-15 01:30:43
【问题描述】:
我在 SQL Server 2017 Developer 中的存储过程存在问题。它使用xp_cmdshell 获取文件的修改日期,将varchar 返回到临时表中并尝试将其转换为日期。当我在 SSMS 中手动执行存储过程时,它正在工作,但是当我将它放入作业步骤时失败。
作业历史错误:
从字符串转换日期和/或时间时转换失败。 [SQLSTATE 22007](错误 241)
我已经标记了失败的代码片段(当我试图在没有这个的情况下在作业中执行 SP 时,它执行成功)。
当我只执行“问题”代码时,它工作正常并返回这样的数据:
代码:
select top(1) cast(left(mdate,20) as date) data_
from t_lomag_temp_table
结果:
2018-03-14
存储过程代码:
declare @lomag_bak_file_source nvarchar(400) = /*source folder*/
declare @restore_status int
declare @bak_list as table (id int identity
, plik varchar(200)
, data_bak date)
declare @baza_nazwa varchar(200)
declare @xp_cmdshell_dir varchar(1000)
declare @counter int
declare @loop_limit int
declare @bak_files_status int
set @restore_status = 0
set @bak_files_status = 0
set @counter = 1
;
truncate table t_lomag_temp_table
;
insert into @bak_list
select concat(dl.baza,'_db.bak'), null
from t_lomag_database_list dl
;
select @loop_limit = max(id) from @bak_list
while @counter <= @loop_limit
begin
select @baza_nazwa = bl.plik
from @bak_list bl
where bl.id = @counter
set @xp_cmdshell_dir = concat('dir ',@lomag_bak_file_source,@baza_nazwa)
insert t_lomag_temp_table
exec master.dbo.xp_cmdshell @xp_cmdshell_dir
set rowcount 5
delete from t_lomag_temp_table
set rowcount 0
/* JOB PROBLEM CODE varchar to date*/
update @bak_list
set data_bak = x.data_
from (select top(1) cast(left(mdate, 20) as date) data_
from t_lomag_temp_table) x
where @baza_nazwa = plik
set @counter = @counter + 1
end
;
begin transaction
delete from logistyka.dbo.t_lomag_restore_dates
commit transaction
;
begin transaction
insert into logistyka.dbo.t_lomag_restore_dates
select
plik, data_bak, 1, 0
from
@bak_list
;
select @bak_files_status = min(rd.date_status_fl)
from logistyka.dbo.t_lomag_restore_dates rd
;
commit transaction
;
【问题讨论】:
标签: sql sql-server tsql stored-procedures sql-server-agent