有人可以解释为什么这段代码会导致错误吗?
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的对象
答案 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