最近对一些客户的系统进行维护,因为需要升级数据库,经常需要发一些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文件正常执行?

解决方案 »

  1.   

    在。sql中自己进行错误处理,输出错误消息
      

  2.   

    先告诉你@@error为什么得到0@@error是全局函数,返回当前会话最后一次(获取@@error前)执行的语句的状态。
    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)