SQL Server - 使用"删除临时表如果...则"在TRY和CATCH内

时间:2017-12-24 01:39:22

标签: sql sql-server

有人可以解释为什么这段代码会导致错误吗?

BEGIN TRY
    IF OBJECT_ID ('TEMPDB..#ABC') IS NOT NULL 
    BEGIN
        DROP TABLE #ABC
    END;

    SELECT 1 AS A, 2 AS B 
    INTO #ABC;
END TRY
BEGIN CATCH
END CATCH;

DROP TABLE #ABC;

BEGIN TRY
    IF OBJECT_ID ('TEMPDB..#ABC') IS NOT NULL 
    BEGIN
        DROP TABLE #ABC
    END;

    SELECT 3 AS C, 4 AS D 
    INTO #ABC;
END TRY
BEGIN CATCH
END CATCH;

SELECT * FROM #ABC;

错误发生在第二个TRY和CATCH语句中,表明#ABC表已经存在,即使在第二个TRY块之前有一个drop语句,甚至在第二个TRY内,还有一个" IF OBJECT_ID ..那么下降"言。

  

Msg 2714,Level 16,State 1,Line XX
  数据库中已有一个名为#ABC的对象

2 个答案:

答案 0 :(得分:1)

您需要在两个块之间使用“GO”,否则SQL Server将尝试将整个语句集作为单个实体执行。

因为第一部分中有DDL,所以在解析第二个语句时不会执行它。通过在第一个CATCH结束后放置“GO”,脚本应该可以正常执行。

答案 1 :(得分:1)

在一个批处理中,你有两个INTO #ABC所以在编译sql server时没有考虑它们创建的条件,它只会抛出错误,认为你试图创建两次相同的表。

BEGIN TRY
  BEGIN
     IF OBJECT_ID ('TEMPDB..#ABC') IS NOT NULL 
     DROP TABLE #ABC
     create table #ABC(A tinyint, b tinyint, c tinyint, d tinyint)
  END;
  Insert into #ABC(A, B)
  SELECT 1 AS A, 2 AS B 

END TRY
BEGIN CATCH
END CATCH;

BEGIN TRY
  Insert into #ABC(C, D)
  SELECT 3 AS C, 4 AS D 

END TRY
BEGIN CATCH
END CATCH;

SELECT * FROM #ABC;

如果您不想在结果中使用4列,则创建两个中间临时表并将结果插入到中间临时表中,并将两个表的结果插入#ABC