最近对一些客户的系统进行维护,因为需要升级数据库,经常需要发一些sql文件给客户,让客户直接在数据库中运行;但是有一些客户无IT部,操作员对此不知如何操作,因此做了可执行文件执行此操作;具体使用的如下sql命令: master.dbo.xp_cmdshell 'osql /U sa /P /i c:\query.sql'但是在使用中发现,无论sql文件是否正确,在sql命令执行后,@@error值都是为0,无法根据此状态值判断sql是否正常执行;考虑了下,@@error返回值为0,只是表示cp_cmdshell命令正常执行,不表示sql文件正常执行;请教诸位:使用上面的方法,如何能判断sql文件正常执行?
xp_cmdshell 'osql ....'
xp_cmdshell 处于当前会话,调用osql,执行sql语句,新建立了连接,开辟了新连接,所以@@error只是表示xp_cmdshell有没有成功调用osql
到于osql里面的代码是否执行成功,无法用@@error获取。
如何得到osql执行语句是否成功?
给个简单例子你:
if object_id('#t') is not null
drop table #t
go
create table #t(v varchar(8000) null)
go
insert #t exec master.dbo.xp_cmdshell 'osql -Sxxx -Usa -Pxx -i d:\xxx.sql'
go
declare @s varchar(8000)
select top 1 @s=v from #t
if patindex('%消息%,级别%,状态%',@s)>0 --这里你可以换用更准确的匹配 '消息 数字,级别 数字,状态 数字'
print 'exec failed'
else
print 'exec successful'
如果你的xxx.sql是个批语句,即非单条语句,或者是多个批,那么将if patindex...改为
if exists(select 1 from #t where patindex('%消息%,级别%,状态%',v)>0)