SQL Server最终尝试捕获

kis*_*sta 30 sql t-sql sql-server

我有一个场景,我需要类似的东西 .NET's try-catch-finally block.

在我的尝试,我会CREATE a #temp table,INSERT数据,将其与过程中的其他数据集的基础上#temp.

CATCH随后RAISERROR.有可能有FINALLYDROP #temp吗?下面是伪代码:

BEGIN TRY

  CREATE TABLE #temp
  (
     --columns
  )
  --Process data with other data sets

END TRY
BEGIN CATCH

  EXECUTE usp_getErrorMessage

END CATCH
BEGIN FINALLY

  DROP TABLE #temp

END FINALLY
Run Code Online (Sandbox Code Playgroud)

Dav*_*ett 25

虽然与FINALLY不完全相同,但Try-Catch的T-SQL版本确实允许在END CATCH语句结束后可以发生Try和Catch块之后需要执行的代码.使用问题代码作为示例:

    BEGIN TRY
      CREATE TABLE #temp
       (
         --columns
       )
      --Process data with other data sets
    END TRY
    BEGIN CATCH
    EXECUTE usp_getErrorMessage
    END CATCH;

IF OBJECT_ID('tempdb..#temp') IS NOT NULL -- Check for table existence
    DROP TABLE #temp;
Run Code Online (Sandbox Code Playgroud)

无论Try还是Catch执行,DROP TABLE命令都将执行.请参阅:BOL尝试......捕获

  • SQL Server 2016 或更高版本,您可以单行执行“DROP TABLE IF EXISTS #temp``”,而不是使用带有“OBJECT_ID”的“IF”语句。 (4认同)

Bec*_*uzz 12

您可以只声明一个表变量(在查询结束时会自动消失),而不是创建表.

BEGIN TRY
DECLARE @temp TABLE
(
    --columns
)
--do stuff
END TRY
BEGIN CATCH
--do other stuff
END CATCH
Run Code Online (Sandbox Code Playgroud)


Pao*_*olo 7

没有FINALLY等价物.
替代方案可能是表变量但不完全相同,必须根据具体情况进行评估.
有一个问题,细节对于做出明智的选择非常有用.
使用表变量,您不需要像使用临时表一样进行清理

  • 临时表的替代方法可能是临时表吗?我认为你的意思是表变量.另外[这是一个更好的问题,有更多细节](http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in - SQL服务器). (2认同)

小智 5

“FINALLY”通常(但并非总是)在功能上与 TRY/CATCH 后面的“最终”代码相同(没有正式的“FINALLY”块)。不同之处在于 TRY/CATCH 块中的某些内容可能导致执行结束,例如 return 语句。

例如,我使用的模式是打开游标,然后将使用游标的代码放在 TRY 块中,并在 TRY/CATCH 块之后关闭/释放游标。如果块不会退出正在执行的代码,则此方法可以正常工作。但是,如果 TRY CATCH 块执行 RETURN(这听起来像是一个坏主意),如果有FINALLY块,它将执行,但“最终”代码放置在 TRY / CATCH 之后,如下所示T-SQL 要求,如果这些代码块导致执行结束,则不会调用最终代码,从而可能会留下不一致的状态。

因此,虽然很多时候您可以将代码放在 TRY/CATCH 之后,但如果这些块中的任何内容可以终止而不进入清理代码,这将是一个问题。