我试图在一个过程中做到这一点:
DECLARE @a bit = 1;
BEGIN
SELECT * INTO #aTemp FROM OPENROWSET( ... );
IF @a = 0
BEGIN
SELECT ... INTO #bTemp FROM #aTemp;
END
ELSE
BEGIN
SELECT ... INTO #bTemp FROM #aTemp;
END
END
我得到错误:
Msg 2714, Level 16, State 1, Line 10
There is already an object named '#bTemp' in the database.
为什么会发生这种情况,是否有解决方法?
更新
我试图按照这里DROP
的建议添加一个语句,但它仍然不起作用:
DECLARE @a bit = 1;
BEGIN
SELECT * INTO #aTemp FROM OPENROWSET( ... );
IF @a = 0
BEGIN
IF OBJECT_ID('[tempdb]..#bTemp') IS NOT NULL
BEGIN
DROP TABLE #bTemp;
END
SELECT ... INTO #bTemp FROM #aTemp;
END
ELSE
BEGIN
IF OBJECT_ID('[tempdb]..#bTemp') IS NOT NULL
BEGIN
DROP TABLE #bTemp;
END
SELECT ... INTO #bTemp FROM #aTemp;
END
END
根据文档:
我最终在块之前创建了表格,
IF
如下所示:这不是问题的答案,只是向@SebastienMeine 演示##global 临时表如何杀死并发。
在一个窗口中,执行以下操作:
结果:
然后打开另一个窗口,执行以下操作:
结果:
所以##table 仍然存在,即使它创建的过程早已完成。
然后在第一个窗口完成后,再次尝试在第一个窗口中运行此部分:
结果:
因此,即使同一用户只是尝试再次创建,##table 仍然存在。
这说明:
如果无法预先创建临时表并且不想将核心逻辑放在动态 SQL 中,这是我使用的解决方案。