截断临时表 vs 删除临时表 Sql Server

4
有两种方法来检查临时表的存在并重新创建它:
1.
IF Object_id('TEMPDB..#temp') IS NOT NULL
  TRUNCATE TABLE #temp
ELSE
  CREATE TABLE #temp
    (
       id INT
    ) 

2.

IF Object_id('TEMPDB..#temp') IS NOT NULL
  DROP TABLE #temp

  CREATE TABLE #temp
    (
       id INT
    ) 

有没有使用其中一个比另一个更有优势?

我相信你提供的两种方式会产生不同的结果。 - Felix Pamittan
是的,一个使用 Truncate,另一个使用 drop,但两个查询都旨在执行相同的操作。 - Pரதீப்
我认为你的第二种情况是没有 ELSE 的。 - Horia
我同意@Horia的观点。这就是为什么我认为它不同。您的第二种情况在“DROP”之后不会重新创建表。 - Felix Pamittan
@FelixPamittan - 抱歉,各位。已更新。 - Pரதீப்
显示剩余2条评论
1个回答

2
如果存在名为temp的表,则执行TRUNCATE操作,否则创建新表。
IF Object_id('temp') IS NOT NULL
  TRUNCATE TABLE temp
ELSE
   CREATE TABLE temp
    (
       id INT
    );

原始表的架构可能与ELSE语句中的架构不同,这可能导致错误的结构。

CREATE TABLE temp(col VARCHAR(100));
INSERT INTO temp VALUES ('a');

IF Object_id('temp') IS NOT NULL
  TRUNCATE TABLE temp
ELSE
    CREATE TABLE temp
    (
       id INT
    );

INSERT INTO temp VALUES (1);  

SqlFiddle演示

输出:

╔═════╗
║ col ║
╠═════╣
║   1 ║
╚═════╝

如果存在名为temp的表,则删除它。然后重新创建它。
IF Object_id('TEMPDB..#temp') IS NOT NULL
  DROP TABLE #temp

CREATE TABLE #temp
(
       id INT
); 

在这个例子中,您始终可以确信您获得了在CREATE语句中定义的结构。
CREATE TABLE temp(col VARCHAR(100));
INSERT INTO temp VALUES ('a');

IF Object_id('temp') IS NOT NULL
  DROP TABLE temp

CREATE TABLE temp
(
       id INT
)    

INSERT INTO temp
VALUES (1);  

SqlFiddleDemo2

输出结果:

╔════╗
║ id ║
╠════╣
║  1 ║
╚════╝

如果表不存在,两种方法返回相同的结构: < p > SqlFiddleDemo_3 SqlFiddleDemo_4


1
是的,你说得对,我从来没有考虑过结构的变化.. :) - Pரதீப்

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接