【问题标题】:Move row from one table to another?将行从一个表移动到另一个表?
【发布时间】:2010-05-13 19:11:14
【问题描述】:

我有两个具有相同列定义的表。我需要将一行从一个表移动(而不是复制)到另一个表。在我开始使用 INSERT INTO/DELETE(在事务中)之前,有没有更聪明的方法?

SQL Server 2005

【问题讨论】:

    标签: sql-server sql-server-2005 insert-into


    【解决方案1】:

    对于 SQL Server 2005 及更高版本,请尝试使用 OUTPUT Clause (Transact-SQL) 子句:

    DELETE OldTable
      OUTPUT DELETED.col1, DELETED.col2...
          INTO NewTable
      WHERE ID=...
    

    工作示例:

    DECLARE @OldTable table(col1 int, col2    varchar(5), col3 char(5), col4     datetime)
    DECLARE @NewTable table(col1 int, column2 varchar(5), col3 int    , col_date char(23), extravalue int, othervalue varchar(5))
    INSERT @OldTable VALUES (1 , 'AAA' ,'A'  ,'1/1/2010'           )
    INSERT @OldTable VALUES (2 , 'BBB' ,'12' ,'2010-02-02 10:11:22')
    INSERT @OldTable VALUES (3 , 'CCC' ,null ,null                 )
    INSERT @OldTable VALUES (4 , 'B'   ,'bb' ,'2010-03-02'         )
    
    DELETE @OldTable
        OUTPUT DELETED.col1
              ,DELETED.col2
              ,CASE
                   WHEN ISNUMERIC(DELETED.col3)=1 THEN DELETED.col3 
                   ELSE NULL END
              ,DELETED.col4
              ,CONVERT(varchar(5),DELETED.col1)+'!!'
            INTO @NewTable (col1, column2, col3, col_date, othervalue)
        OUTPUT 'Rows Deleted: ', DELETED.* --this line returns a result set shown in the OUTPUT below
        WHERE col1 IN (2,4)
    
    SELECT * FROM @NewTable
    

    输出:

                   col1        col2  col3  col4
    -------------- ----------- ----- ----- -----------------------
    Rows Deleted:  2           BBB   12    2010-02-02 10:11:22.000
    Rows Deleted:  4           B     bb    2010-03-02 00:00:00.000
    
    (2 row(s) affected)
    
    col1        column2 col3        col_date                extravalue  othervalue
    ----------- ------- ----------- ----------------------- ----------- ----------
    2           BBB     12          Feb  2 2010 10:11AM     NULL        2!!
    4           B       NULL        Mar  2 2010 12:00AM     NULL        4!!
    
    (2 row(s) affected)
    

    【讨论】:

    • @KM:+1。我没有意识到这一点。你会推荐这种方法而不是INSERT 和DELETE吗?
    • 我每次都会在 INSERT 和 DELETE 上使用它,SQL Server 可能会更好地优化它,它保证你只插入和删除相同的行,不多也不少。
    • 这是一个声明,所以......我猜不需要交易?
    • 我状态很好。这是一个绝对的远景,我问这个问题。我只是想在做“我知道的事情”之前先问问聪明人。得到这么棒的答案真是太令人满意了,而且看到许多其他人和我一样思考并从我的问题中学到了这种“新”技术,这更加令人满意。非常感谢。
    • @Max,如果您需要捕获已删除的行,没有比使用 OUTPUT 更好的方法了。如果您需要另一列,我会在使用 DELETE OUTPUT 填充行后更新并加入它。
    【解决方案2】:

    你可以试试 Insert into abc (a,b,c) 从def中选择(a,b,c)

    这样做会将 def 的 a、b、c 列插入 abc 的 a、b、c 列。插入后运行删除表、删除表或截断您的标准。

    样本是:

    Begin
        Begin try
    
             Begin Transaction
    
                   Insert into emp(name, department, salary)                    
                           Select empName,empDepartment,empSal from employees
                           Where  employees.empID = 211
    
                   Truncate table employees
    
              End Transaction  
    
        End try
    
        Begin Catch
    
             if @@Error > 0
                  Rollback Transaction
    
        End Catch
    
    End
    

    【讨论】:

      【解决方案3】:

      SQL 中没有 MOVE 命令之类的东西。 您必须首先从表 1 插入表 2 然后从表 1 中删除副本。

      【讨论】:

      【解决方案4】:

      不,您几乎被包含在事务中的插入和删除所困扰

      【讨论】:

      【解决方案5】:
      INSERT dbo.newtable(
            name,
            department,
            Salary
      ) SELECT 
                  name,
                  FirstName,
                  Lastname
            FROM    (
                 DELETE dbo.oldtable
                 OUTPUT
                         DELETED.name,
                         DELETED.department,
                         DELETED.Salary
                 WHERE ID  IN ( 1001, 1003, 1005 )
            ) AS RowsToMove  
      
      SELECT * FROM dbo.newtable
      SELECT * FROM dbo.oldtable
      

      【讨论】:

        猜你喜欢
        • 2013-11-18
        • 2016-03-22
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        相关资源
        最近更新 更多