假设我有两个具有相同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中删除
谢谢。
答案 0 :(得分:4)
你需要
注意: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