将特定行迁移到具有相同列的另一个表?

时间:2011-05-04 17:17:41

标签: sql sql-server

假设我有两个具有相同3列的表:ID(int,identity),text(varchar),status(smallint)

通过执行查询,我如何从Table_B中传输Table_A中的行内容?

即:

INSERT INTO TABLE_B VALUES (SELECT * FROM TABLE_A WHERE ID=1) 
 --THIS IS NOT FUNCTIONAL

这是捕获:插入Table_B的那行也需要从Table_A中删除

谢谢。

3 个答案:

答案 0 :(得分:4)

你需要

  1. SET IDENTITY_INSERT保留ID
  2. 交易
  3. 注意:SET XACT_ABORT ON强制ROLLBACK TRAN出错

    SET XACT_ABORT ON
    BEGIN TRAN
    
    SET IDENTITY_INSERT TABLE_B ON
    INSERT TABLEB (ID, text, status)
    SELECT ID, text, status FROM TABLE_A WHERE ID=1
    SET IDENTITY_INSERT TABLE_B OFF
    
    DELETE TABLE_A WHERE ID=1
    COMMIT TRAN
    

    修改

    CREATE PROC dbo.foo
       @ID int
    AS
    SET NOCOUNT, XACT_ABORT ON
    BEGIN TRAN
    
    SET IDENTITY_INSERT TABLE_B ON
    INSERT TABLEB (ID, text, status)
    SELECT ID, text, status FROM TABLE_A WHERE ID=@ID
    SET IDENTITY_INSERT TABLE_B OFF
    
    DELETE TABLE_A WHERE ID=@ID
    COMMIT TRAN
    GO
    

答案 1 :(得分:2)

即使你没有提到你正在使用的sql server版本...... OUTPUT子句可能是你最好的选择(SQL SERVER 2k5 +)

Move row from one table to another?

这不仅会照顾你的插入,它也会照顾你的删除,因为它一次完成你不必担心交易......它可能是最安全的方法在sql中这样做服务器

修改

只是为了清楚......据我所知,只有当你的id列不必是一个身份时它才会起作用....如果它确实...那么一个xaction插入/删除是唯一的安全要走的路。

答案 2 :(得分:1)

这很好用

CREATE TABLE Table_A
(
ID INT IDENTITY(1,1) PRIMARY KEY,
[TEXT] VARCHAR(50),
[status] SMALLINT
)

INSERT INTO Table_A VALUES ('foo',1)

CREATE TABLE Table_B
(
ID INT IDENTITY(1,1) PRIMARY KEY,
[TEXT] VARCHAR(50),
[status] SMALLINT
)

SET IDENTITY_INSERT Table_B ON
DELETE FROM Table_A
OUTPUT deleted.* INTO Table_B(ID,[TEXT], [status])
WHERE ID = 1
SET IDENTITY_INSERT Table_B OFF

SELECT * FROM Table_A
SELECT * FROM Table_B

DROP TABLE Table_A
DROP TABLE Table_B