在sql server中将数据从t1表交换到t2表,并将t2表交换到t1表

在sql server中将数据从t1表交换到t2表,并将t2表交换到t1表,sql,sql-server,tsql,Sql,Sql Server,Tsql,输出:- T1 T2 id name id name 1 a 1 e 2 b 2 f 3 c 3 g 4 d 4 h 将t1复制到临时表 T1 T2 id name id name 1 a 1 e 2 b 2 f 3

输出:-

T1                T2    
id  name        id  name
1   a           1   e
2   b           2   f
3   c           3   g
4   d           4   h
  • 将t1复制到临时表

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
        T1               T2 
        id  name        id  name
        1   e           1   a
        2   f           2   b
        3   g           3   c
        4   h           4   d
    
  • 空t1

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    SELECT * INTO #swap FROM t1;
    
  • 将t2复制到t1

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    DELETE FROM t1;
    
  • 空t2

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    INSERT INTO t1 SELECT * FROM t2;
    
  • 将临时表复制到t2

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    DELETE FROM t2;
    
  • 要解释任何错误,请务必将其包装在事务中。总之:

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    INSERT INTO t2 SELECT * FROM #swap;
    

    不要将值从T1交换到T2,因为如果记录很大,则交换数据将花费更多时间,只需按如下方式重命名表即可

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    BEGIN TRY
        BEGIN TRANSACTION;
        SELECT * INTO #swap FROM t1;
        DELETE FROM t1;
        INSERT INTO t1 SELECT * FROM t2;
        DELETE FROM t2;
        INSERT INTO t2 SELECT * FROM #swap;
        COMMIT TRANSACTION;
        PRINT 'Success';
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;
        PRINT 'Fail';
    END CATCH
    
    您可以在上找到有关此过程的文档

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    如果需要包含架构名称,则只能将其包含在第一个参数中(也就是说,这不能用于将表从一个架构移动到另一个架构)。例如,这是有效的:

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    EXEC sp_rename 'T1', 'T1_10' 
    EXEC sp_rename 'T2', 'T1' 
    EXEC sp_rename 'T1_10', 'T2' 
    
    更新:

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    作为OP表结构,这里的Id也需要重命名

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    EXEC sp_rename 'myschema.T1', 'T1_10'
    

    多亏了@for pointing

    ,您还可以通过执行
    内部连接
    来实现上述功能:

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    sp_rename [PK_tblKeyTEST] ,[PK_tblKey]
    
    结果:

    T1                T2    
    id  name        id  name
    1   a           1   e
    2   b           2   f
    3   c           3   g
    4   d           4   h
    
    select t2.* from t1
    inner join t2 on t2.id = t1.id ----- T1
    
    select t1.* from t1
    inner join t2 on t2.id = t1.id ----- T2
    

    重命名表怎么样?你真的希望得到答案吗?这甚至不是一个恰当的问题……也许你可以分享一下为什么互换是必要的,以及问一个恰当的问题?公平地说,如果没有令人信服的理由永久交换任何内容,那么您可以简单地更改查询以从T1而不是T2提取数据,反之亦然。如果可以只重命名一个表,则似乎过于繁重了。@matbaile True。就我个人而言,我不太热衷于重命名表格。。。这并不总是重要的,但所有关联的名称保持不变(索引名称、约束名称等),并且不会重命名它们。在某些情况下可能会很尴尬。工作正常,但请注意,任何依赖名称(约束、索引、PK名称等)都不会被重命名。如果表名是用这些依赖名称编码的,可能会造成一些尴尬。