【问题标题】:copy table and drop it复制表并删除它
【发布时间】:2023-04-05 09:52:01
【问题描述】:

我知道我们可以简单地创建一个新表并复制旧表

select * into tbl2 from tbl1

我想检查表 tbl2 是否存在,如果存在则复制所有行,如果不存在则创建一个新行,而无需在 tbl2 中指定列名,因为我正在复制所有列tbl2 在 tbl1 中。然后,我想删除旧表(tbl1)

if not exists(select * from tbl1 where id = 1)
   create table tbl2()
   drop tbl1
go

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql stored-procedures


    【解决方案1】:
    IF (EXISTS (SELECT * 
             FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_NAME = 'tbl2'))
    BEGIN
        -- tbl2 exists, so just copy rows
        INSERT INTO tbl2 SELECT * FROM tbl1;
    END
    ELSE BEGIN
        -- tbl2 doesn't exist, so create new table tbl2 and copy rows 
        SELECT * INTO tbl2 FROM tbl1;
        DROP tbl1;
    END
    

    这不会复制索引、键等 - 只是创建时的列名(在 else 分支中)。

    【讨论】:

      【解决方案2】:
      If object_id ("tempdb..#tbl2") is null
          Select * into #tbl2 from tbl1
      Else
          Insert #tbl2 select * from tbl1
      

      如果你不希望它是临时表,去掉 # 和 tempdb

      【讨论】:

        【解决方案3】:

        这将检查tbl2,如果存在,则插入表2。如果不存在,它将选择到tbl2。

        IF (EXISTS (SELECT * 
                         FROM INFORMATION_SCHEMA.TABLES 
                         WHERE TABLE_SCHEMA = 'schema' 
                         AND  TABLE_NAME = 'tbl2'))
        BEGIN
            -- If the table exists, insert into:
            INSERT INTO tbl2 SELECT * from tbl1
            drop tbl1
        END
        ELSE
        BEGIN
            SELECT * INTO tbl2 FROM tbl1
        END
        

        【讨论】:

        • 嗨,丹!它在 tbl2 不存在时工作,但如果 tbl2 已经存在则给出错误。我不得不删除 table_schema ='schema' 部分并且工作正常。谢谢。
        • 啊,是的,您需要更改架构以匹配 tbl1 的架构。如果在多个模式下存在相同的表名,那么拥有该部分可确保它正在查看正确的表,schema.tbl1 vs sch.tbl1。
        【解决方案4】:

        问题是,如果它确实存在,你怎么能确定表定义是完全相同的,如果你不想要这样的额外检查并且总是假设它们是相同的,那么你可以使用 INSERT INTO ...选择 * 从

        IF  NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbl2]') AND type in (N'U'))
        BEGIN
            -- create the table only if not there
            select * into tbl2 from tbl1 where 1 <> 1
        END
        
        insert into tbl2 select * from tbl1
        

        或者您可以将其更改为删除 11 以仅插入记录,并将插入插入到 else 块中。

        IF  NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbl2]') AND type in (N'U'))
        BEGIN
            -- create the table only if not there
            select * into tbl2 from tbl1
        END
        ELSE BEGIN
            insert into tbl2 select * from tbl1
        END
        

        存在的代码块是Sql Server管理工作室生成的,我只是复制过来的。

        【讨论】:

          猜你喜欢
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-17
          • 1970-01-01
          • 1970-01-01
          • 2015-08-21
          • 1970-01-01
          相关资源
          最近更新 更多