将行从一个表移到另一个表?

lan*_*nce 17 sql-server sql-server-2005 insert-into

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

SQL Server 2005

KM.*_*KM. 32

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

DELETE OldTable
  OUTPUT DELETED.col1, DELETED.col2...
      INTO NewTable
  WHERE ID=...
Run Code Online (Sandbox Code Playgroud)

工作范例:

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
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

               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)
Run Code Online (Sandbox Code Playgroud)

  • 我身材很好.这是一个*绝对*远射,我问这个问题.我只是以为在做"我所知道的"之前我会问聪明的人.获得如此出色的答案真是太令人满意了,看到其他多个人一如既往地思考并从我的问题中学习了这种"新"技术,就更令人满意了.非常感谢. (3认同)
  • @Max,如果需要捕获已删除的行,没有比使用OUTPUT更好的方法了.如果你需要另一个列我会更新并在用DELETE OUTPUT填充行之后加入它. (2认同)