exec('..')
if @@error<>0
  .....

解决方案 »

  1.   

    转大力的贴子。
    一、首先从SQLServer中Error讲起,SQL中错误处理有些怪辟 错误级别同是16但结果都不同。  select * from 一个不在的表
      if @@error<>0
        print '这个没有输出'
      go  raiserror('',16,3)
      if @@error<>0
        print '这个输出了'
      go  exec('select * from 一个不在的表')
      if @@error<>0
        print '这个输出了'
      go  exec sp_executesql N'select * from 一个不在的表'
      if @@error<>0
        print '这个输出了'这样你可以发现通过exec或sp_executesql执行可疑的sql,这样就可以在后面捕捉到被异常终止的错误。
    二、引出孤立事务:
      1、孤立事务的产生    select @@trancount 当前连接的活动事务数 --当前连接的活动事务数为0    begin tran    select * from 一个不在的表
        if @@error<>0
        begin
          print '没有执行到这里来!'
          if @@trancount<>0 rollback tran
        end    commit tran    select @@trancount 当前连接的活动事务数  --执行后你看看 当前连接的活动事务数为1,且重复执行会每次累加,这是很耗资源的。  应为rollback根本就没有被回滚。  2、使用现有手段解决孤立事务
        print @@trancount print '当前连接的活动事务数' --当前连接的活动事务数为0    if @@trancount<>0 rollback tran --在这里写可以让孤立事务只保持到下次你的过程被调用
        begin tran    select * from 一个不在的表
        if @@error<>0
        begin
          print '没有执行到这里来!'
          if @@trancount<>0 rollback tran
        end    commit tran    ---执行后你看看 当前连接的活动事务数为1,但重复执行不会累加
        print @@trancount print '当前连接的活动事务数'三、使用 set xact_abort 来控制部分违反约束的错误的执行过程  create table Table1 (a int check(a>100))
      go  set xact_abort on
      begin tran
        insert table1 values(10)
        print '这里没有被执行'
      commit tran
      go
      
      print '' print '==============================================' print ''
      
      set xact_abort off
      begin tran
        insert table1 values(10)
        print '这里被执行'
      commit tran  go
      drop table table1但 set xact_abort 对于编译产生的错误确没有起作用,且同样会产生孤立事务  set xact_abort on
      begin tran
        insert  一个不在的表 values(10)
        print '这里没有被执行'
      commit tran
      go  print '' print '==============================================' print ''  set xact_abort off
      begin tran
        insert  一个不在的表 values(10)
        print '这里没有被执行'
      commit tran
      go  select @@trancount 当前连接的活动事务数 ---有两个孤立事务
      if @@trancount<>0 rollback tran
    对于sql中怪辟的各种错误,和孤立事务在t-sql编程中一定要注意,小心孤立事务的陷阱,尽量避免浪费或孤立资源,Microsoft公开宣布过SQLServe下一版本Yukon将有内置异常处理语法。那时可以通过代码对无法预料的错误有更好的控制。
      

  2.   

    set noexec on
    exec('..')
    if @@error<>0
      .....
     Transact-SQL 参考  
    SET NOEXEC
    编译每个查询但不执行查询。语法
    SET NOEXEC { ON | OFF }注释
    当 SET NOEXEC 为 ON 时,Microsoft&reg; SQL Server&#8482; 编译每个批处理 Transact-SQL 语句但并不执行它们。当 SET NOEXEC 为 OFF 时,所有批处理将在编译后执行。在 SQL Server 中,语句的执行包括两个阶段:编译和执行。该设置可用于让 SQL Server 在执行 Transact-SQL 代码时,验证代码中的语法和对象名。它也可以用于调试通常是较大的批处理语句一部分的语句。SET NOEXEC 设置是在执行或运行时设置,而不是在分析时设置。权限
    SET NOEXEC 权限默认授予所有用户。示例
    下例在有效查询、含有无效对象名的查询以及含有不正确语法的查询中使用 NOEXEC。USE pubs
    GO
    PRINT 'Valid query'
    GO
    -- SET NOEXEC to ON.
    SET NOEXEC ON
    GO
    -- Inner join.
    SELECT a.au_lname, a.au_fname, t.title
    FROM authors a INNER JOIN titleauthor ta
       ON a.au_id = ta.au_id INNER JOIN titles t
       ON ta.title_id = t.title_id
    GO
    -- SET NOEXEC to OFF.
    SET NOEXEC OFF
    GO
    PRINT 'Invalid object name'
    GO
    -- SET NOEXEC to ON.
    SET NOEXEC ON
    GO
    -- Function name used is a reserved keyword.USE pubs
    GO
    CREATE FUNCTION values (@storeid varchar(30))
    RETURNS TABLE
    AS
    RETURN (SELECT title, qty
       FROM sales s, titles t
       WHERE s.stor_id = @storeid and
       t.title_id = s.title_id)
    -- SET NOEXEC to OFF.
    SET NOEXEC OFF
    GO
    PRINT 'Invalid syntax'
    GO
    -- SET NOEXEC to ON.
    SET NOEXEC ON
    GO
    -- Built-in function incorrectly invoked
    SELECT *
    FROM fn_helpcollations()
    -- Reset SET NOEXEC to OFF.
    SET NOEXEC OFF
    GO
    请参见SETSET SHOWPLAN_ALLSET SHOWPLAN_TEXT&copy;1988-2000 Microsoft Corporation。保留所有权利。